Копируйте файлы в Linux, избегайте копирования, если файлы существуют в месте назначения

32

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

я использую

cp -r /origin /destination

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

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

Открой путь
источник
2
Не с нами. Вместо этого используйте rsync.
Уильям Перселл

Ответы:

22

cp -R -u -p /source /destination

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

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

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

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

user31894
источник
6
Буквально только копировать файлы, которые не существуют, и не обновлять существующие, yes n | cp -i /source/* /destination 2>/dev/null
sventechie
4
-u, --update копировать только в том случае, если файл SOURCE новее, чем файл назначения, или если целевой файл отсутствует -u, --update копировать только в том случае, если файл SOURCE новее файла назначения или отсутствует целевой файл -p аналогично --preserve = mode, owner, timestamps --preserve [= ATTR_LIST] сохраняет указанные атрибуты (по умолчанию: mode, owner, timestamps), если возможно, дополнительные атрибуты: context, links, xattr, all
Covich
51

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

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

-n, --no-clobber

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

Balmipour
источник
7
Это единственный верный ответ на вопрос.
Sebix
20

rsync -aq /src /dest

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

Мартин Беккет
источник
Я не могу добавить форматирование `` к вашему сообщению, потому что это только два символа. Как бы вы относились к редактированию этого и добавлению `` символов вокруг вашей команды?
culix
4

Посмотрите опцию "-u" для cpкоманды.

Заостренный
источник
2
Не согласен с тем, что использование -u это хорошая идея. -u копирует только тогда, когда источник новее или отсутствует пункт назначения. Проблема оригинального плаката была вызвана повреждением копии файла по любой причине. Поэтому у OP будет наполовину записанный файл, который не был обновлен при повторном запуске копии. Этот файл может быть важен для кого-то! rsync решает эту проблему.
Хазимат
2

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

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

 cp -rn SOURCE_PATH DESTINATION_PATH
grepit
источник
1

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

# cp -au

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

pixelbeat
источник
1

Решение POSIX

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

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

while true; do echo n; done | cp -Ri /origin /destination 2>/dev/null
Камиль Мачоровски
источник
0

использование cp -rn <sourcedirname>/. <destdirname>

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

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

Символ ' /.' после имени источника гарантирует, что он не станет подкаталогом с именем destdir вместо того, чтобы копировать все содержимое первого в последнее.

taatparya
источник