Лучший способ синхронизации файлов – копировать только СУЩЕСТВУЮЩИЕ файлы и только если NEWER, чем целевой

Я делаю эту синхронизацию локально на Ubuntu 12.04. Обычно файлы представляют собой небольшие текстовые файлы (код).

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

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

Я действительно буду копировать из source в несколько target каталогов. Я упоминаю об этом, если это повлияет на выбор решения. Тем не менее, я могу легко запустить свою команду несколько раз, указав новую target каждый раз, если это то, что требуется.

One Solution collect form web for “Лучший способ синхронизации файлов – копировать только СУЩЕСТВУЮЩИЕ файлы и только если NEWER, чем целевой”

Я считаю, что вы можете использовать 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/ , он отправляется.

тестирование

Чтобы убедиться, что все работает до того, как вы отключите команду, я бы предложил использовать другой --dry-run rsync , --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) 
  • форсирование sudo на удаленном сервере rsync
  • rsync через ssh из linux в windows sbs 2003 несоответствие протокола
  • RAID1 vs rsync - безопасность?
  • rsync и права на запись в целевой
  • Обнаружение на удаленном хосте, на котором были обработаны файлы
  • Есть ли способ разместить комментарии в файле rsync -files-from?
  • от разреженного файла до блочного устройства по сети
  • Альтернатива rsync -delete для перемещения файлов в другой каталог вместо удаления
  • Какова работа демона rsync?
  • Резервное копирование Windows-ПК на Linux-машину
  • rsync зависает, если я не дефрагментирую файловую систему ext4
  • Rsync link-dest - неуверенный, если он создает жесткие ссылки
  • Linux и Unix - лучшая ОС в мире.