首页 > 解决方案 > Bash (Mac) - 将随机文件移动到具有“填充限制”的多个其他文件夹

问题描述

我在一个文件夹中有几百个文件,我想使用 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)

标签: bashshellmv

解决方案


像这样的东西,(未测试)

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,不需要单独维护文件列表。


推荐阅读