Скрипт для распространения большого количества файлов на небольшие группы - PullRequest
3 голосов
/ 30 января 2011

У меня есть папки, содержащие большое количество файлов (например, 1000+) различных размеров, которые я хочу переместить в более мелкие группы, скажем, по 100 файлов в папке.

Я написал сценарий Apple, который насчиталфайлы, создали пронумерованную подпапку, а затем переместили 100 файлов в новую папку (можно указать количество файлов), которая зациклилась, пока не было меньше указанного количества файлов, которые она переместила в последнюю созданную папку.

Проблема заключалась в том, что он бежал ужасно медленно.Я ищу сценарий Apple или сценарий оболочки, который я могу запустить на своем компьютере MacBook и / или Linux, чтобы эффективно перемещать файлы в более мелкие группы.

Способ группировки файлов не особенно важен,Мне просто нужно меньше файлов в каждой папке.

Ответы [ 3 ]

3 голосов
/ 30 января 2011

Это огромный клудж, но он не должен быть слишком медленным:

rm /tmp/counter*
touch /tmp/counter1
find /source/dir -type f -print0 | 
    xargs -0 -n 100 \
        sh -c 'n=$(echo /tmp/counter*); \
               n=${n#/tmp/counter}; \
               counter="/tmp/counter$n"; \
               mv "$counter" "/tmp/counter$((n+1))"; \
               mkdir "/dest/dir/$n"; \
               mv "$@" "/dest/dir/$n"' _

Совершенно неразборчиво, куда и куда идут файлы.

2 голосов
/ 30 января 2011

Это должно помочь вам начать:

DIR=$1
BATCH_SIZE=$2
SUBFOLDER_NAME=$3
COUNTER=1

while [ `find $DIR -maxdepth 1 -type f| wc -l` -gt $BATCH_SIZE ] ; do
  NEW_DIR=$DIR/${SUBFOLDER_NAME}${COUNTER}
  mkdir $NEW_DIR
  find $DIR -maxdepth 1 -type f | head -n $BATCH_SIZE | xargs -I {} mv {} $NEW_DIR
  let COUNTER++
if [ `find $DIR -maxdepth 1 -type f| wc -l` -le $BATCH_SIZE ] ; then
  mkdir $NEW_DIR
  find $DIR -maxdepth 1 -type f | head -n $BATCH_SIZE | xargs -I {} mv {} $NEW_DIR
fi
done

Вложенный оператор if получает последние оставшиеся файлы.Вы можете добавить некоторые дополнительные проверки, если сочтете нужным, после того, как измените их для использования.

1 голос
/ 30 января 2011

Наиболее распространенный способ решения проблемы каталогов со слишком большим количеством файлов в них - это разделение по первым парам символов имени.Например:

До:

aardvark
apple
architect
...
zebra
zork

После:

a/aardvark
a/apple
a/architect
b/...
...
z/zebra
z/zork

Если это не достаточно хорошее подразделение, то сделайте еще один шаг:

a/aa/aardvark
a/ap/apple
a/ar/architect
...
z/ze/zebra
z/zo/zork

Это должно работать довольно быстро, потому что команда перемещения, выполняемая вашим сценарием, может использовать простое расширение glob для выбора всех файлов, которые нужно переместить, ala mv aa* a/aa, в отличие от необходимости отдельно запускать команду перемещения для каждого файла(это было бы мое первое предположение о том, почему оригинальный сценарий был медленным)

...