24

Мне нужно скопировать папку /home /user с одного жесткого диска на другой. Он имеет 100 000 файлов и размером около 10G.

я использую

cp -r /origin /destination

иногда я получаю некоторые ошибки из-за неработающих ссылок, разрешений и так далее. Поэтому я исправляю ошибку, и мне нужно снова начать копирование.

Интересно, как я мог сказать команде "cp", как только она пытается скопировать снова, чтобы не копировать файлы снова, если они существуют в папке назначения.

8 ответов8

23

Просто используйте cp -n <source> <dest> .

С man-страницы:

-n, --no-clobber

НЕ перезаписывать существующий файл (переопределяет предыдущий параметр -i)

18

cp -R -u -p /source /destination

Флаг -u (или --update) делает именно это:

Со страницы руководства для cp:

-у, - обновить

копировать только в том случае, если файл SOURCE новее файла назначения или отсутствует файл назначения

16

rsync -aq /src /dest

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

4

Найдите параметр «-u» для команды cp .

2

Все приведенные выше ответы верны, но если вы делаете это рекурсивно, то

ты должен сделать:

 cp -rn SOURCE_PATH DESTINATION_PATH
1

Вы должны копировать с правами root, чтобы сохранить права доступа

# cp -au

Также посмотрите на rsync

0

Используйте cp -rn <sourcedirname>/. <destdirname>

Переключатель r делает копию рекурсивной по каталогам.

Переключатель n (длинная версия no-clobber) гарантирует, что существующие файлы никогда не будут перезаписаны.

' /. 'после того, как sourcedirname гарантирует, что оно не станет подкаталогом с именем destdirname, а все содержимое первого будет скопировано во второе.

0

Решение POSIX

Другие ответы используют опции -u или -n cp . POSIX не требует ничего из этого ; и rsync из другого ответа; yes используется в одном из комментариев.

Тем не менее , мы можем воспроизвести yes n с циклом. Это приводит к следующему решению POSIX:

while true; do echo n; done | cp -Ri /origin /destination 2>/dev/null

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .