
Какую команду tar следует использовать, чтобы получить файлы, измененные после указанной даты, включая изменения владельца, разрешений и т. д., но исключая файлы, которые были просто восстановлены из резервной копии?
С другой стороны, будет ли предпочтительнее пройтись по всем файлам после восстановления и изменить время изменения статуса каждого из них в ходе восстановления?
Я использую команду, похожую на следующую, чтобы архивировать в tar все недавно измененные файлы с указанной даты для периодического резервного копирования:
$ SINCE=20190501
$ tar cf - --after-date="${SINCE} 00:00:00" . | tar tvf -
Это не настоящая команда, но она иллюстрирует то, что я пытаюсь донести. Эта команда просто выводит список файлов, которые должны были бы попасть в файл tar, если бы я вместо этого отправлял вывод в файл tar.
До сих пор я думал, что эта команда работает нормально, пока я не заменил жесткий диск и не восстановил все файлы из резервной копии. Глядя на вывод stat
, кажется, что дата изменения — это дата, когда я восстановил все файлы из резервной копии, поэтому теперь все файлы выбираются в моей команде tar выше.
$ stat restore_file.txt
...
Modify: 2019-04-01 23:52:12.000000000 -0500
Change: 2019-05-25 01:52:10.737688040 -0500
Даже --newer-mtime
это, похоже, не помогает:
$ tar cf - --newer-mtime="${SINCE}" . | tar tvf -
ОБНОВЛЯТЬ:Я также попробовал следующее, но это тоже не помогло, поскольку все равно было выбрано больше файлов, чем мне нужно:
$ SINCE=201905010000
$ touch -t "${SINCE}" /tmp/timestamp
$ stat /tmp/timestamp
Access: 2019-05-01 00:00:00.000000000 -0500
Modify: 2019-05-01 00:00:00.000000000 -0500
Change: 2019-06-30 18:29:19.277267874 -0500
$ tar cf - --after-date /tmp/timestamp . | tar tvf -
решение1
Отфильтровав каталоги:
$ tar cf - --after-date="${SINCE} 00:00:00" . | tar tvf - | grep -v '^d'
Я вижу, что файлы, которые я хотел захватить, действительно забираются, и ничего более.
По какой-то причине tar захватывает все каталоги без учета временной метки, но, думаю, с этим можно смириться, так что приведенная выше команда в большинстве случаев по-прежнему работает нормально, и именно поэтому я не видел с ней никаких проблем, пока не восстановил резервную копию.
Теперь относительно восстановления: я заявил, что это устанавливает атрибут «Изменить» для каждого восстановленного файла; следовательно, --after-date
это бесполезно, поскольку в моем следующем резервном копировании будут сохранены все файлы.
Чтобы обойти это, в первый раз после восстановления я перешел на использование --newer-mtime
:
$ tar cf - --newer-mtime="${SINCE} 00:00:00" . | tar tvf -
--after-date
Это позволило мне получить все новые файлы с момента восстановления, и я планирую снова использовать оригинал, начиная со следующей резервной копии.
У этого метода есть один недостаток, описанный ниже: если между восстановлением файлов и созданием первой резервной копии произошли какие-либо изменения прав доступа или владельца, я об этом не узнаю и, вероятно, никогда не узнаю, если только права доступа или владельца тех же файлов снова не изменятся. В этом случае я получу обновление только в этот момент, а все мои резервные копии до этого момента будут восстановлены с неправильными правами доступа или владельцем.
TheРуководство по GNU tarговорится следующее:
Статус файла считается измененным, если его содержимое было изменено или если изменились его владелец, разрешения и т. д.
Я не совсем понимаю, что значит «и так далее», но это я тоже упускаю.
Учитывая, что я здесь резервирую, меня это не беспокоит, поэтому на этот раз меня это устраивает; однако, в тех случаях, когда меня это действительно волнует, я могу либо выбросить свои инкрементальные резервные копии и начать все заново с совершенно новой полной резервной копии, либо завершить процесс восстановления одной инкрементальной резервной копией, следуя шагам выше, используя --newer-mtime
сразу после восстановления. Последнее произойдет до того, как люди начнут использовать восстановленные файлы, поэтому я получаю хорошую инкрементальную резервную копию, прежде чем переключиться обратно на --after-date
.