Как я могу скопировать (большой) каталог поверх другого, изменив только файлы, которые отличаются?

14

У меня есть каталог а и каталог б. Они большие. б почти идентичен а. «почти» означает, что 4-5 файлов различаются, и я не знаю, какие они есть. Я хочу скопировать b поверх a, но только файлы, которые отличаются. я в баш.

(нет, я не могу просто удалить a и заменить его на b, потому что 1) a управляется версией 2) полная копия (или mv) займет слишком много. Я хочу копировать только файлы, которые отличаются).

janesconference
источник
Есть rsyncвариант?
Бобби
Да, но я не знаю много о rsync.
janesconference

Ответы:

17

Вы можете использовать rsyncдля этого, я использую командуrsync -tr "folder to copy from" "folder to copy to"

например rsync -tr /home/me/stuff/* /home/me/otherstuff/

одевать
источник
1
ОСТОРОЖНО этой команды. Это удалит все файлы, которые не будут отличаться. Я запустил его и потерял почти все!
Арвинд К.
@Arvind Я не знаю, какую команду вы использовали, что привело к потере ваших данных, но это не был rsync -tr. Прочитайте справочную страницу.
Тог
18

Это также возможно сделать со старым добрым cp:

Спасибо srcspider за напоминание об использовании -T!

cp -ruT old-dir new-dir

new123456
источник
+1 Я так привык синхронизироваться между машинами, что забыл элегантные способы.
Tog
у меня не работает :(
janesconference
Это на самом деле хорошо GNU CP. ;-)
Кит
1
В OS X опция -u не существует. Я просто использовал cp -r old-dir new-dir, так как мне не нужно было сравнивать даты.
Жан-Франсуа Бошан
Не работает. Я не уверен, что это какое-то соглашение об именах, но cp -ru folder-A folder-B будет просто копировать папку A внутри папки B, а не копировать содержимое A внутри B и перезаписывать, что было бы желаемым эффектом.
srcspider
1

Другим хорошим вариантом является Unison ( http://www.cis.upenn.edu/~bcpierce/unison/ ), особенно если на самом деле нет «источника» и «места назначения». Каждый каталог является корневым, и Unison синхронизирует их и сохраняет метаданные для будущих синхронизаций. Он предлагает как командную строку, так и опцию GUI, которую можно легко запланировать через cron.

Я использую его для создания резервной копии моего Dropbox на локальном устройстве NAS, на котором не работает клиент Dropbox.

Digitalcraig
источник
1

Это МОЖЕТ быть сделано с хорошим старым, хотя и с немного другим форматом, чем указано выше. Вот как я это сделал:

cp -ru --target-directory="destination_path" source_path/*
Свен Крун
источник
1

Вы можете различить 2 каталога.

diff -r dir1 dir2

он покажет вам список файлов, которые отличаются

Олег
источник