Найкращий спосіб синхронізації файлів - копіюйте лише ІСНУЮЧІ файли і лише у випадку, якщо НОВИЙ, ніж націлений


18

Я роблю цю синхронізацію локально на Ubuntu 12.04. Файли, як правило, невеликі текстові файли (код).

Я хочу скопіювати (зберігаючи штамп mtime) з sourceкаталогу в, targetале я хочу лише скопіювати, якщо файл у файлі target вже існує і є старшим, ніж в source.

Тому я копіюю лише новіші файли source, але вони повинні існувати в targetних, інакше вони не будуть скопійовані. ( sourceматиме набагато більше файлів, ніж target.)

Я фактично буду копіювати з sourceдекількох targetкаталогів. Я згадую про це, якщо це впливає на вибір рішення. Однак я можу легко запускати свою команду кілька разів, вказуючи targetкожен раз новий , якщо це те, що потрібно.

Відповіді:


29

Я вважаю, що ви можете використовувати rsyncдля цього. Ключовим спостереженням було б потреба у використанні перемикачів --existingта --updateперемикачів.

        --existing              skip creating new files on receiver
        -u, --update            skip files that are newer on the receiver

Така команда зробить це:

$ rsync -avz --update --existing src/ dst

Приклад

Скажімо, у нас є такі вибіркові дані.

$ mkdir -p src/; touch src/file{1..3}
$ mkdir -p dst/; touch dst/file{2..3}
$ touch -d 20120101 src/file2

Що виглядає так:

$ ls -l src/ dst/
dst/:
total 0
-rw-rw-r--. 1 saml saml 0 Feb 27 01:00 file2
-rw-rw-r--. 1 saml saml 0 Feb 27 01:00 file3

src/:
total 0
-rw-rw-r--. 1 saml saml 0 Feb 27 01:00 file1
-rw-rw-r--. 1 saml saml 0 Jan  1  2012 file2
-rw-rw-r--. 1 saml saml 0 Feb 27 01:00 file3

Тепер, якби я синхронізував ці каталоги, нічого не відбудеться:

$ rsync -avz --update --existing src/ dst
sending incremental file list

sent 12 bytes  received 31 bytes  406.00 bytes/sec
total size is 0  speedup is 0.00

Якщо у нас touchє вихідний файл, щоб він був новішим:

$ touch src/file3 
$ ls -l src/file3
-rw-rw-r--. 1 saml saml 0 Feb 27 01:04 src/file3

Ще один запуск rsyncкоманди:

$ rsync -avz --update --existing src/ dst
sending incremental file list
file3

sent 115 bytes  received 31 bytes  292.00 bytes/sec
total size is 0  speedup is 0.00

Ми можемо бачити, що file3, оскільки вона є новішою і що вона існує dst/, вона надсилається.

Тестування

Для того, щоб переконатися , що все працює , перш ніж вирізати команду вільно, я пропоную використовувати інші rsyncкомутатори «S, --dry-run. Додамо ще одне, -vтому rsyncвисновок є більш багатослівним.

$ rsync -avvz --dry-run --update --existing src/ dst 
sending incremental file list
delta-transmission disabled for local transfer or --whole-file
file1
file2 is uptodate
file3 is newer
total: matches=0  hash_hits=0  false_alarms=0 data=0

sent 88 bytes  received 21 bytes  218.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)

Дякую. Чи не потрібно мені ще кілька варіантів rsync? Я читаю сторінку чоловіка. Здається , що я , можливо , це потрібно: rsync --archive --update --existing --whole-file --itemize-changes a/ b. Або більшість із цих варіантів непотрібні? (Я додав цілий файл, оскільки це в основному невеликі текстові файли.)
MountainX для Моніки Стейліо

@MountainX - додайте лише потрібні варіанти. Я хотів би почати з -aце надбудовою перемикачів, -rlptgoD.
slm

Дозвольте мені уточнити це. Я розгублений з приводу --updateі --existing. Чи потрібно мені обоє? Я перевірив ваше рішення, і, здається, він працює, але я все ще відчуваю себе безпечнішим --update.
MountainX для Моніки Селліо

@MountainX - впевнений, що ти можеш додати його, я також покладу його в A.
slm
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.