Какой самый быстрый способ скопировать первые 100 тыс. Папок из одного каталога в другой в bash - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть каталог с папками около 500 КБ, и я хочу скопировать папки 100 КБ в этом каталоге в другой каталог.

В настоящее время я взял пути к папкам 100 КБ, а затем скопировал их в другой каталог, используя:

while read line; do cp -R $line <dest_folder>; done < file_with_paths.txt

При описанном выше подходе много времени занимает копирование одной папки (в каждой папке обычно 2 файла) каждые 2 секунды.

Есть ли более быстрый способ сделать это?

Ответы [ 2 ]

0 голосов
/ 24 апреля 2018

Я бы использовал xargs из пакета GNU finutils:

xargs -P 1 cp -r -t dest_folder < file_with_paths.txt
  • -P 1 указывает xargs запускаться только в подпроцессах одновременно, поскольку cp не очень хорошо работает параллельно
  • cp используется с -t в качестве xargs в качестве аргумента в конце команды

Эта команда будет запускать несколько cp, каждая с максимально возможным количеством папок в качестве аргумента.Если вы хотите контролировать, сколько папок копируется каждым процессором, используйте параметр -L, например -L 999.

Обратите внимание, что его можно комбинировать с ls -1 | head -n 100000, если «file_with_paths.txt» нестроить заранее.

0 голосов
/ 24 апреля 2018

Я часто использую tar для копирования иерархий

не проверено

cd /path/to/source/directory
<file_with_paths.txt xargs sh -c '
    tar cf - "$@" | (cd /path/to/destination/directory && tar xf -)
' sh

Я могу представить, что это будет медленнее, чем rsync

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...