Rsync: копирование только по временным меткам


42

В настоящее время у меня есть две директории A / и B /, которые идентичны во всех отношениях, за исключением временных меток. Поэтому, если я запускаю команду:

rsync --dry-run -crvv A/ B/

тогда все файлы помечаются как «обновленные», тогда как команда:

rsync --dry-run -rvv A/ B/

показывает, что все файлы должны быть скопированы из A / в B /.

У меня такой вопрос: учитывая, что я знаю, что файлы идентичны (по содержанию), то есть ли способ (через rsync или иным образом) установить метки времени для файлов в B /, которые будут идентичны меткам времени файлов в A /, без копирования всех файлов из A / в B /?

Благодарность


Если вы знаете, что файлы идентичны, то почему вы не должны копировать их, чтобы получить нужную вам дату / время?
Тим

3
@Tim: может быть, есть много данных.
Ричард

Ответы:


75

Использование -t(сохранить временные метки) и --size-onlyбудет сравнивать только файлы по размеру. Если размер совпадает, rsync не будет копировать файл, но, поскольку -tон указан, он обновит временную метку в целевом файле без повторного копирования.

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

У меня была проблема с тем, что изначально я не использовал rsync для копирования группы файлов на новый диск, и поэтому метки времени были обновлены до текущего времени. Я использовал команду ниже, чтобы синхронизировать все правильно в приличном количестве времени:

rsync -vrt --size-only /src /dest

2
Я также предлагаю добавить, --existingчтобы предотвратить случайные копии новых файлов.
Леден

1
Флаг --archive(или -a) включает в себя -r, -tи больше :)
Dor

6

Использование --size-only заставит rsync пропустить сравнение временных меток файла (и, следовательно, содержимого файла), если размеры совпадают. Объединение этого с --times клонирует временные метки в целевом дереве.


3

Я думаю, что rsync - правильный инструмент для этого, но если вы хотите, чтобы какой-то сценарий делал это, чем-то, что может дать хорошее начало.

Вы можете получить список файлов с отметками времени (время доступа), например:

find . -printf '"%p" %a\n' -type f > /tmp/times

И получить соответствующие команды обновления времени от него:

 while read line; do echo touch -a -d \"${line#* }\" ${line%% *}; done < /tmp/times

Это не полный сценарий, а хорошее начало! :)


Спасибо. Я думаю, что я, вероятно, на данный момент буду придерживаться Rsync, но я обязательно пойду в Интернет и изучу различные компоненты вашего скрипта, поскольку это может быть полезно в будущем.
Артелла

Это, казалось, было именно моим решением! Я хочу сохранить время при добавлении метаданных в мою музыкальную библиотеку. Однако, по-видимому, он не может обрабатывать пробелы в именах файлов):
Буркардо

2

Используйте каталог источника (например /path/to/source) в качестве ссылки для сенсорной команды. Просто cdв ваш целевой каталог и сделать

find -type f -exec touch -r /path/to/source/{} {} \;

Вы не можете копировать метки времени менее секунды с помощью rsync (пока).

Это также работает для каталогов и псевдо-файлов (просто удалите или измените -type f)


Это было полезно для меня, так как мне нужно было время скопировать. Я заметил, что он не копирует ctime, что было нормально в моем случае.
snapfractalpop

Просто прочитайте справочную страницу «Прикосновение». Вы можете установить atime и mtime как с этой командой.
knorke

Да, я знаю, что вы можете использовать, touch -arно это все равно не меняет ctime. Я полагаю, что это редко желательно.
snapfractalpop

Ах, я вижу проблему сейчас. Спасибо. Да, ctime трудно изменить, и я не знаю почему.
knorke

1

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

Но это, вероятно, займет гораздо больше времени, чем просто позволить rsync попытаться скопировать все файлы. Фактически будет передано очень мало данных (только блочные хэши, если файлы действительно идентичны). Но полное содержимое каждого файла должно быть прочитано по крайней мере с каждой стороны. Так что из вас ограничены пропускной способностью диска или IOPS, это может занять некоторое время. Но все же, вероятно, меньше времени, чем написание и тестирование сценария для этого.


Спасибо, я не знал об этой функции rsync (это также обсуждается в википедии).
Артелла

0

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

Он основан на решении, предоставленном Stone. Однако, здесь о времени модификации и рабочем скрипте для восстановления временных меток. Сначала сделайте первый шаг, затем начните работать со своими файлами.

  1. Сохранить старые метки времени . Он работает из текущего каталога, исключает все скрытые файлы и сохраняет его во временный файл в /tmp/files. Вы всегда можете изменить параметры, но лучше остаться с, -printf '"%t" "%p"\n'так как более поздняя touchкоманда использует это.

    find . ! -iname ".*" -printf '"%t" "%p"\n' -type f > /tmp/files

  2. Измените ваши файлы так, как вам нравится

  3. Теперь создайте файл, который поможет вам восстановить временные метки:

    while read line; do echo touch -a -d $line >> job.sh; done < /tmp/times

  4. И, наконец, применить старые даты к измененным файлам

    sh job.sh

Предостережение: работает для файлов с интервалом имен, специальными символами, но, например, без файлов со $знаком в нем.


Чтобы избежать (некоторых) проблем с обратной косой чертой в именах файлов, используйте read -r line. Ну, всегда используйте readс -r. Кроме того, вы можете избежать открытия job.shдля каждого файла. Просто поместите перенаправление в конце команды:while read -r path; do echo touch -a -d $path ; done < /tmp/times > job.sh
hagello

2-е предупреждение: этот сценарий не передает метки времени в каталогах. (Ну, ОП не просил об этом.)
Гагелло

0

Лучший способ скопировать только метку времени в Windows:

Чтобы скопировать последний созданный / измененный / использованный штамп времени любого файла в другой, вы можете использовать:

touch / c / m / a / r SourceFile DestFile

(Эта версия Touch является частью Win32 Console ToolBox http://www.stevemiller.net/apps/ )

Робокопия "SOURCE_DIRECTORY" "DESTINATION_DIRECTORY" / E / COPYALL / DCOPY: DAT / XF . / R: 10 / W: 5 / V / ETA


-1

Руководство по rsync: man rsyncперечисляет -tи -Nпереключает, с ними, возможно, стоит возиться.


Я не мог видеть -N. Почему вы рекомендуете это в любом случае?
Том Хейл
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.