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

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

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

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

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

  • rsync несколько файлов из нескольких каталогов в Linux
  • Как добавить массив аргументов внутри моего вызова rsync внутри скрипта?
  • зарезервировать дисковое пространство перед копированием файлов
  • rsync не перезаписывает новые файлы
  • Разрешения на доступ к файлу в главном каталоге, как я начинаю?
  • Инкрементное резервное копирование и восстановление резервных копий с использованием / rsync или rdiff-backup
  • синхронизировать только самые новые файлы и папки, ограничить размер
  • Синхронизация локальных файлов с удаленным репозиторием git
  • 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) 
    Linux и Unix - лучшая ОС в мире.