У меня есть папка с 200 000 изображений. Я хочу сделать следующее:
Папка 1 (с количеством изображений X) Папка 2 (с количеством изображений X) Папка 3 (с количеством изображений X) Папка 4 ( Имеет количество изображений X)
Запустите скрипт в своем каталоге изображений. Убедитесь, что в месте назначения нет подкаталогов.
IMG=100 # Number of images to move DES="." # Destination I=$(find . -maxdepth 1 -mindepth 1 -type f | wc -l) N=$(( (I / IMG) + (I % IMG) )) eval mkdir "$DES"/Folder{01..$N} for i in $(find "$DES" -maxdepth 1 -mindepth 1 -type d | sort); do mv $(find . -maxdepth 1 -mindepth 1 -type f | sort | grep -m $IMG '.*') $i done
Попробуйте этот скрипт, он должен выполнить ваш запрос, но последние X-файлы останутся в исходном каталоге.
OrigDIR=~/FolderX DestDIR=~/FolderY NumberOfMovedItems=$1 SubDestDir=$2 Count=1 while [ `find $DIR -OrigDIR 1 -type f| wc -l` -gt $NumberOfMovedItems ] ; do NewSubDir=$DestDIR/${SubDestDir}${Count} mkdir $NewSubDir find $OrigDIR -maxdepth 1 -type f | head -n $NumberOfMovedItems | xargs -I {} mv {} $NewSubDir let Count++ done
Измените путь к FolderX и FolderY, как вам нравится.
Когда вы запускаете скрипт, вы должны указать количество элементов для перемещения и название подкаталога
Я бы начал с создания списка
ls X > X.list
for Y in `seq 1 10` ; do mkdir $Y ; mv `head -n $(( Y * 50 )) X.list | tail -n 50` $Y ; done
. Ответ @BasharatSialvi (с уважением):
Это работает, но есть две проблемы:
1- Он создает I % IMG
дополнительные каталоги, которые останутся пустыми
2- Он имеет классическую ошибку bash, широко известную как bash pitfall номер 1.
Первая проблема не так критична, так как вы можете удалить эти лишние каталоги, но вторая проблема во многих случаях приводит к тому, что все идет не так. Например, когда у вас есть место в именах файлов.
Поэтому я улучшаю ответ @BasharatSialvi:
COUNT=5 # Number of files to move
DES="." # Destination
DESFOLPRE="folder" # Prefix of the destination folders
I=$(find . -maxdepth 1 -mindepth 1 -type f | wc -l) # Find all files
N=$((I / COUNT)) # Number of directories needed
if [[ $((I % COUNT)) != 0 ]]; then N=$((N+1)); fi # Add one directory if cant fit files perfectly
eval mkdir "$DES"/"$DESFOLPRE"{01..$N} # Create directories
for i in $(eval echo {01..$N}) # For every directory move COUNT files
do
$(find . -maxdepth 1 -mindepth 1 -type f | sort | head -$COUNT | xargs -I filename mv filename $DES/$DESFOLPRE$i/)
done
Обратите внимание, что ни ответ Башарата, ни мой ответ не заботятся о типах файлов, поэтому говорить, что они перемещают только изображения, неправильно. Они перемещают все файлы.
Надеюсь, это поможет.