Bash (Mac) - 使用"Fill Limit"将随机文件移动到多个其他文件夹



我在一个文件夹中有几百个文件,我想用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写入一个单独的文件夹

最新更新