Я хочу использовать 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_{#}'