我在一个文件夹中有几百个文件,我想用bash脚本将它们随机移动到多个不同的文件夹中——然而,我想只填充给定容量的每个目标文件夹。
我认为正确的方法是分配两个数组,一个包含所有目标文件夹,另一个包含全部文件。然后我可以从filesarr
中随机获取一个文件,并将其放置在目标文件夹中。我的问题是,如何限制放置在每个目标文件夹中的文件数?假设我正在为每个目标文件夹寻找十个文件——我如何将前十个文件从filesarr
移动到foldersarr
中的第一个文件夹,然后将下十个文件移动到foldersarr
中的第二个文件夹,直到所有文件都已移动?我知道我可能应该在这里使用计数器,但我目前的尝试(如下)并没有奏效。
filesarr=(/Path/to/files/*) # this is the array of files to shuffle
foldersarr=(/Path/to/destination/folders/) # array of folders to move into
foldercount=0 # set it to 0
for afolder in "${foldersarr[@]}"; do
if [[ "$foldercount" -gt 10 ]]; then
echo "$foldercount files in folder, exiting and moving to next folder"
exit 1
else
for afile in "${filesarr[@]}"; do # do loop length(array) times; once for each file
length=${#filesarr[@]}
randomi=$(( $RANDOM % $length )) # select a random index
filename=${filesarr[$randomi]}
mv ${filename} ${foldersarr[@]}
echo "moving '$filename'"
foldercount=$((foldercount+1))
unset -v "filesarr[$randomi]" # unset after moved
array=("${filesarr[@]}") # remove NULL elements introduced by unset; copy array
done
fi
done
我当前的目录结构包括一个"保留"目录中的所有文件,以及我想将它们移动到一个单独文件夹中的所有目标文件夹。
rootfolder
│
├── holding
│ ├── dywd.pdf
│ ├── ... (approx. 200 files)
│ └── kjfwekfjnwe.pdf
│
└── destinations
├── folder01
├── ...
└── folder10
我想以这个结束:
rootfolder
│
├── holding
│
└── destinations
├── folder01
│ ├── lwkejdwe.pdf
│ ├── ...
│ └── (ten files in this folder)
├── ...
│
└── folderXX
├── qwuoe.pdf
├── ...
└── (ten files in this folder)
类似的东西,(未测试)
dirs=(..) # array of dirs
dir_length=${#dirs[@]}
find -maxdepth 1 -type f | # or any other list of files
shuf |
while c=0 IFS= -r file;
do mv "$file" "{dirs[c++%$dir_length]}";
done
这将循环移动文件到目标目录。随机性是用shuf
生成的,不需要单独维护文件列表。
您可以创建一些"bucket"变量,并用相同数量的文件名填充每个变量,例如将范围内的所有文件划分为这些bucket。完成后,将每个bucket写入一个单独的文件夹