Bash (Mac) - перемещение рандомизированных файлов в несколько других папок с «пределом заполнения» - PullRequest
0 голосов
/ 28 января 2019

У меня есть пара сотен файлов в одной папке, и я хотел бы произвольно переместить их в несколько разных папок с помощью скрипта 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)

Ответы [ 2 ]

0 голосов
/ 28 января 2019

что-то вроде этого (не проверено)

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, нет необходимости вести список файлов отдельно.

0 голосов
/ 28 января 2019

Вы можете создать несколько переменных «buckets» и заполнить каждую из них одинаковым количеством имен файлов, например, разделить все ваши файлы в области видимости на эти сегменты.Затем, когда закончите, запишите каждое ведро в отдельную папку

...