Как переместить только определенное количество изображений из папки

У меня есть папка с 200 000 изображений. Я хочу сделать следующее:

  1. Переместить количество изображений X (50 изображений, 100 изображений, 200 изображений) из этой папки в папку Y.
  2. Каждая папка Y может быть номером (папка 1, папка 2, папка 3 ...).
  3. Конечный результат может выглядеть следующим образом:

Папка 1 (с количеством изображений X) Папка 2 (с количеством изображений X) Папка 3 (с количеством изображений X) Папка 4 ( Имеет количество изображений X)

4
задан 16 October 2012 в 04:41

4 ответа

Запустите скрипт в своем каталоге изображений. Убедитесь, что в месте назначения нет подкаталогов.

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
0
ответ дан 16 October 2012 в 04:41

Попробуйте этот скрипт, он должен выполнить ваш запрос, но последние 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, как вам нравится.

Когда вы запускаете скрипт, вы должны указать количество элементов для перемещения и название подкаталога

Источник

0
ответ дан 16 October 2012 в 04:41

Я бы начал с создания списка

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
.
0
ответ дан 16 October 2012 в 04:41

Ответ @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

Обратите внимание, что ни ответ Башарата, ни мой ответ не заботятся о типах файлов, поэтому говорить, что они перемещают только изображения, неправильно. Они перемещают все файлы.

Надеюсь, это поможет.

0
ответ дан 13 November 2020 в 20:58

Другие вопросы по тегам:

Похожие вопросы: