как сказать rsync, чтобы сохранить метку времени в файлах, когда исходное дерево имеет точку монтирования

42

Связанный с этим вопросом

Краткое описание проблемы:

Если исходное дерево имеет подключенную точку внутри, тогда метки времени для файлов внутри этой подключенной точки при копировании в целевое дерево не сохраняются даже при использовании -aпараметра

Подробное описание:

Предположим, что это исходное дерево:

                       /home/                           /home/
                         |                                |
                        me/                             BACKUP/
                         |                                |
                    +----+----------+                +----+-------+
                    |    |          |                |    |       |
                 data/  foo.txt    boo.txt         data/ foo.txt boo.txt
                    |                                |
                   a.txt                           a.txt

где data/выше смонтирован внешний USB-диск. Все это ext4файловая система. Все в источнике принадлежит мне me.

BACKUP Также оказалась точка монтирования, резервный USB-диск.

После выполнения этой команды rsync -av --delete /home/me/ /home/BACKUP/я обнаружил, что /home/BACKUP/data/и все, что находится под ней, имеет текущую метку времени, как будто эти файлы были созданы сейчас, а не метку времени для файлов в /home/me/data/. Другие файлы и папки снаружи dataсохранили отметку времени в порядке.

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

Я использую:

>uname -a
Linux 3.5.0-17-generic #28-Ubuntu SMP x86_64 x86_64 x86_64 GNU/Linux

>rsync -v
rsync  version 3.0.9  protocol version 30
Nasser
источник

Ответы:

46

от man rsync:

   -t, --times                 preserve modification times

РЕДАКТИРОВАТЬ - улучшить этот ответ, поскольку не сразу понятно, почему это не помогло OP:

OP копирует файлы из одной файловой системы в другую и хочет сохранить c-time. Большинство людей понимают, c-timeчто означает «время создания», что неверно в большинстве систем UNIX / Linux (файловые системы Windows отслеживают время «создания» или «рождения»).

В большинстве случаев в UNIX и Linux c-timeэто временная метка, используемая для записи последнего изменения индекса inode ' C '. Индод изменяется, если обновляются какие-либо его атрибуты:

OP не может сохранить c-timeсвои файлы, когда они перенесены в новую файловую систему. Создание этих файлов в новых файловых системах является одним из перечисленных выше условий (создание inode / file).

/РЕДАКТИРОВАТЬ

h3rrmiller
источник
9
Спасибо. Я знаю это. Но, пожалуйста, внимательно прочитайте вопрос. Я сделал использование , -aкоторый говорит: для archive mode; equals -rlptgoD этого -tуже включен.
Насер
1
Вы пытаетесь сохранить время смены? ctime НЕ для "созданного", его для изменения (статуса)
h3rrmiller
1
Я хочу, чтобы он работал так же, как и для файлов, которые не находятся на смонтированном диске. т.е. сохраняйте ту же временную отметку, которую вы видите при работе ls -lс файлом. Это работает с файлами, которые не находятся внутри точки монтирования. Но все файлы, которые находятся внутри точки монтирования, имеют отметку времени, указывающую, что они были только что созданы. Как бы вы ни назвали это время. Я просто хотел, чтобы он использовал одинаковую отметку времени для файлов в источнике. Теперь это не так. Я хочу, чтобы все аспекты времени были скопированы. т.е. клон файла будет сделан. время создания, время изменения и т.д ...
Насер
4
время изменения (ctime) обновляется после изменения inode (т.е. создание / изменение разрешения / перемещение / и т. д.). потому что вы создаете новый индекс (потому что вы копируете файл через файловую систему (отдельные таблицы индексов), ctime обновляется. Обойти это невозможно, потому что это изменение индекса, а не файла. en.wikipedia.org/wiki/Stat_(system_call)#ctime
h3rrmiller
3
ls -lпоказывает mtime (изменить) не ctime
h3rrmiller
6

Как уже сказал hr3miller, -a (или --archive) равен -rlptgoD и уже включает время синхронизации.

Однако, когда rsync копирует данные, например, в. при монтировании NFS / FAT32 / NTFS при сбое сохранения пользователя и владельца rsync не будет пытаться установить время. Rsync будет предупреждать что-то вроде

rsync: chown "/mnt/backup/postgres/hourly.0/primary/var" failed: Operation not permitted (1)

Поэтому оставьте сохранение пользователя и группы с помощью

-rlptD

вместо того

-rlptgoD

Используйте это только в том случае, если нет сохранения владельца и группы. Обратите внимание, что сохранение символических ссылок и других функций может также вызвать такое поведение. Вам нужно будет просмотреть справочную страницу для каждой функции rsync (-r -l -p -t -g -o -D), которую вы хотите сделать резервную копию.

user1283043
источник
-2

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

Mik
источник
2
Это потому, что -a( --archive) включает в себя -t.
Heemayl
Однако нет, ctime не может быть произвольно сброшен. (Изначально я неправильно понял вопрос, извините.)
Мик