Синхронизировать две локальные папки в Bash

23

У меня есть одна большая папка «X» в моей домашней директории, и ее устаревшая копия на флешке - Y. Что является аналогом rm Y; cp X Y, но без перезаписи уже существующих файлов?

Jofsey
источник

Ответы:

26

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

man rsync

Но для вашей проблемы я бы предложил:

rsync -a --delete X Y

Таким образом, получатель (Y) удалит любой файл, который у него есть, но не в X. Убедитесь, что вы все сделаете правильно. При неправильном использовании root может легко убить вашу систему ... :)

Маттиас Ослунд
источник
1
Согласитесь, что вы должны быть очень осторожны с этим. Попробуйте добавить --dry-run к команде, чтобы увидеть, что произойдет, фактически не внося никаких изменений. Если все пойдет хорошо, сделайте ту же команду без --dry-run
squarecandy
Небольшая поправка , что мне потребовалось некоторое время , чтобы добраться до rsync -a --delete X/ Y. Эта небольшая косая черта после X заставила его работать так, как мне предназначалось, так что это может помочь и другим. Объясняется здесь: abbeyworkshop.com/howto/unix/nix_rsync/index.html
Шовальт,
15

Посмотрите на rsync (1) . Он предназначен для того, чтобы делать именно то, что вы хотите.

rsync -av X Y

Он поддерживает удаленное копирование через собственный протокол или ssh, но его также можно использовать локально.

В зависимости от того, какое поведение вы хотите, вы также можете передать --updateопцию. Это скажет rsync не перезаписывать файлы, которые уже существуют на цели и являются более новыми, чем те, которые находятся в источнике.

Если вы хотите удалить дополнительные файлы (то есть файлы, которые существуют в Y, но не в X), вы можете добавить --deleteопцию.

Кристоф Провост
источник
Но он не будет удалять файлы, чем удаленные в X, пока не rm Y; cp X Yбудет.
Чтобы удалить файлы, удаленные из X, используйте параметр --delete.
csonuryilmaz
0

Попробуйте использовать rsnyc, возможно, с помощью следующей команды:

rsync -avzu /home/x /y

-u = не перезаписывать файл в месте назначения, если он изменен

bwDraco
источник
Но он не будет удалять файлы, чем удаленные в X, пока не rm Y; cp X Yбудет.
0

Я думаю, что некоторые функции, которые вы ищете в опции -u (обновление), действительно существуют в этой опции:

«--ignore-Существующий» - пропустить обновление файлов, которые существуют на приемнике

промет
источник