Как скопировать несколько тысяч файлов из одной директории в другую?

Простая задача: скопировать файлы из /tmp/src в /tmp/dst. В /tmp/src лежит несколько тысяч файлов.


Во FreeBSD обычное решение не подходит:

cp -p /tmp/src/* /tmp/dst


Выдается ошибка: «/sbin/cp: Argument list too long.» Поэтому я решил так:

find /tmp/src -type f -exec cp -p {} /tmp/dst \;


Можно ли сделать как-то иначе или проще? А как в других *nix'ах?
  • Вопрос задан
  • 7905 просмотров
Пригласить эксперта
Ответы на вопрос 8
Не использовать *, которую shell будет раскрывать в список аргументов. Скопировать каталог целиком.

cp -raT /tmp/src /tmp/dst

Ключевой параметр — -T. Сделате так, чтобы все правильно сработало даже если каталог dst уже есть
Ответ написан
gaelpa
@gaelpa
rsync?
Ответ написан
Комментировать
Iliapan
@Iliapan
Эмм… затарьте папку и потом растарьте
Ответ написан
Комментировать
ColorFlow
@ColorFlow
заархивировать, скопировать, разархивировать
Ответ написан
Комментировать
sledopit
@sledopit
Если уж и использовать find, то лучше так:
find /tmp/src -type f -exec cp -p -t /tmp/dst {} \+
сработает гораздо быстрее вашего варианта.
т.к. с \; на конце будет на каждый файл будет запускаться новый процесс, а в случае с \+ будет запускаться один процесс на много файлов. find сам разрулит сколько файлов можно впихнуть в аргументы за один раз.

ps. Первый раз вижу cp в /sbin.
Ответ написан
Комментировать
cronfy
@cronfy
Если уж find, то лучше с xargs.

А вообще во FreeBSD отлично сработало:

cp -a src/ tmp/

Обратите внимание на слеши в конце. Работает и при существующей папке dst/, и при отсутствующей.
Ответ написан
amarao
@amarao
man xargs

Точно параметры не помню, но примерно так:

ls -1|xargs -n 30 cp -d destignation

Ключевое — максимальное число аргументов за заход (-n) и -d для cp (позволяет поменять местами dest и src).
Ответ написан
Комментировать
srosts
@srosts
Создаём директорию /tmp/dst
# mkdir /tmp/dst
переходим в созданную директорию
# cd /tmp/dst
копируем все файлы из директории /tmp/src в текущую директорию /tmp/dst
# cp /tmp/src/* .
Папки при этом не копируются, что в задаче и не стояло.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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