Назад | Перейти на главную страницу

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

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

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

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

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

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

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

Спасибо

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Он основан на решении, предоставленном 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

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

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

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

touch / c / m / a / r SourceFile DestFile

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

Robocopy "SOURCE_DIRECTORY" "DESTINATION_DIRECTORY" / E / COPYALL / DCOPY: DAT / XF . / R: 10 / W: 5 / V / ETA

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