Используйте parallel для разделения множества каталогов на подкаталоги

Используйте parallel для разделения множества каталогов на подкаталоги

Я хочу использовать parallelдля разделения множества каталогов на подкаталоги. Например, у меня есть 1 000 000 каталогов с содержимым, но это слишком много для одного каталога, поэтому я хочу создать 10 каталогов в главном каталоге и переместить в каждый из них 100 000 исходных каталогов.

Я уже пробовал ls -tr|parallel -n100000 mkdir "dir_{#}"\;mv {} "dir_{#}"команду, но она перемещает только ~10 000 в один подкаталог (иногда ~6200, иногда ~12 500) и создает слишком много подкаталогов - иногда в 10 раз больше, чем мне нужно. Конечно, мне не нужно ровно 100 000 каталогов в каждом подкаталоге, это может быть 101 000 или 98 500 каталогов, это должно быть число в диапазоне 100 000

Итак, как я могу это сделать, используя parallel?

решение1

ГНУparallelрешение:

parallel -j10 -n100000 --no-notice -k 'mkdir -p dir_{#}; mv {} -t dir_{#}' ::: *

  • j N- количество слотов заданий. Запустить до Nзаданий параллельно. В вашем случае мы запустим 10 заданий, чтобы распределить (переместить) все каталоги между новыми 10 родительскими каталогами
  • -n100000- используйте не более 100000аргументов (имен каталогов) на командную строку
  • {#}- порядковый номер задания для запуска. Эта строка замены будет заменена порядковым номером задания, которое будет запущено
  • ::: arguments- использовать argumentsкомандную строку в качестве источника ввода вместо stdin (стандартного ввода)

Для обработки каталогов (dirnames), отсортированных по времени изменения, используйте следующий конвейер:

ls -dtr * | parallel -j10 -n100000 --no-notice -k 'mkdir -p dir_{#}; mv {} -t dir_{#}'

Связанный контент