Для этого можно использовать программы архивирования (, хотя это не так чисто и легко ). Обратите внимание, что метаданные (режим разрешений, владелец, группа, дата/время изменения и т. д. )фактических файлов (в файловой системе )хранятся в inode (т. е. «системные данные» ), но метаданные заархивированного файла (s )хранятся как пользовательские данные в файле архива. Обычно ими можно манипулировать с различной степенью сложности.
Я приведу пример с cpio
; аналогичные эффекты, вероятно, могут быть достигнуты с другими программами архивирования, например, ar
, tar
, pax
, семейство zip
и т. д. Сначала создайте файл tmp.txt
с известной датой/временем модификации. (для воспроизводимости ); затем создайте архив cpio, содержащий только этот файл. Варианты cpio
включают o
для или вывода. (значит cpio
будет писать архив )и c
для использования переносимого(c совместимого )формата, которым может быть легче манипулировать.
$ touch -d "7/12/2017 00:00" tmp.txt $ ls -l tmp.txt -rw-r--r-- 1 myusername mygroupname 0 Jul 12 00:00 tmp.txt $ echo tmp.txt | cpio -oc > tmp.cpio 1 block
Проверьте архив. cpio -itv
означает чтение архива(i nput )и производят v эрбозу t способность содержания.
$ cpio -itv < tmp.cpio -rw-r--r-- 1 myusername mygroupname 0 Jul 12 00:00 tmp.txt 1 block $ cat tmp.cpio 070701000595CC000081A4000303E900030201000000015965668000000000000068E70000C36100 000000000000000000000800000000tmp.txt0707010000000000000000000000000000000000000 0010000000000000000000000000000000000000000000000000000000B00000000TRAILER!!!
Я обнаружил с помощью реверс-инжиниринга (это может быть где-то задокументировано; не проверял )что дата/время модификации первого файла в архиве хранится как время Unix (32 -битное целое число представляющее количество секунд с 01.01.1970 00 :00GMT ), отформатирован как восьмизначный -шестнадцатеричный номер с позициями символов 47 -54. Я выделил значение 59656680
выше. Как только вы узнаете, что это время Unix, отформатированное как восьмизначное шестнадцатеричное число -, найти не сложно. Вы можете получить текущее время Unix (в десятичном виде )с помощью команды date +%s
, и вы можете получить его как шестнадцатеричный, сказав
(date +%s; echo "16op") | dc
Теперь, чтобы изменить метаданные! Отредактируйте архив с помощью редактора по вашему выбору:
$ vi tmp.cpio 0707010005807C000081A4000303E900030201000000015965668000000000000068E70000C36100 000000000000000000000800000000tmp.txt^@^@^@0707010000000000000000000000000000000 0000000010000000000000000000000000000000000000000000000000000000B00000000TRAILER !!!^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ ~ ~ ~ ~ ~ "tmp.cpio" [Incomplete last line] 1 line, 512 characters
Выясните, на что вы хотите его изменить. В своем вопросе вы упомянули о переводе часов на год назад. Ну, количество секунд в нормальном, 365 -дневном году 365×24×60×60 = 31536000 (десятичное )= 1E13380 (шестнадцатеричное ). Итак, вычтите 59656680−1E13380; результат 57843300. И изменить его в файле:
0707010005807C000081A4000303E900030201000000015784330000000000000068E70000C36100 000000000000000000000800000000tmp.txt^@^@^@0707010000000000000000000000000000000 0000000010000000000000000000000000000000000000000000000000000000B00000000TRAILER !!!^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ ~ ~ ~ ~ ~ "tmp.cpio" [Incomplete last line] 1 line, 512 characters
Сохраните и выйдите. Проверьте свои изменения:
$ cat tmp.cpio 070701000595CC000081A4000303E900030201000000015784330000000000000068E70000C36100 000000000000000000000800000000tmp.txt0707010000000000000000000000000000000000000 0010000000000000000000000000000000000000000000000000000000B00000000TRAILER!!! $ cpio -itv < tmp.cpio -rw-r--r-- 1 myusername mygroupname 0 Jul 12 2016 tmp.txt 1 block $ cpio -imuv < tmp.cpio tmp.txt 1 block $ ls -l tmp.txt -rw-r--r-- 1 myusername mygroupname 0 Jul 12 2016 tmp.txt
и о чудо :вы изменили дату/время модификации вашего файла.(cpio -i
без t
читает архив и извлекает файлы; -m
восстанавливает м время модификации; -u
означает u nconditional (без этой опции, cpio
не перезаписывает более новый файл более старым файлом ); и, как обычно, -v
означает v erbose (отображать имена файлов ).)
Примечания:
date -d "Jan 1, 2001" +%s
. Используйте трюк с настольным калькуляторомdc
(), который я показал ранее, чтобы преобразовать его в шестнадцатеричный формат.vi
(vim
), похоже, учитывает те (т. е. потерпеть их и оставить в покое ). Другие редакторы, включая старые версии vi
, может повредить такие файлы (, удалив нули ), или даже отказаться редактировать их. vi
обнаруживает, что архив cpio заканчивается с символом, отличным от новой строки («[Неполная последняя строка]» ). Когда он сохраняет файл, он добавляет новую строку. Другие программы архивации (, отличные отcpio
)может определить это как фальсификацию и может отказаться принимать измененный архив. System Rescue Cd -Я использую его для восстановления ОС клиента. Вы также можете добавить к нему.
Работает для Linux и Windows. Я очень рекомендую это. Есть все, что вы просили, и даже немного.
SystemRescueCd — это диск восстановления системы Linux, доступный в виде загрузочного компакт-диска -ПЗУ или USB-накопителя для администрирования или восстановления вашей системы и данных после сбоя. Он призван обеспечить простой способ выполнения задач администратора на вашем компьютере, таких как создание и редактирование разделов жесткого диска. Он поставляется с множеством системных утилит Linux, таких как GParted, fsarchiver, инструменты файловой системы и базовые инструменты (, редакторы, midnight Commander, сетевые инструменты ). Его можно использовать как для компьютеров с Linux и Windows, так и для настольных компьютеров и серверов. Эта аварийная система не требует установки, так как ее можно загрузить с CD/DVD-привода или USB-накопителя, но при желании ее можно установить на жесткий диск. Ядро поддерживает все важные файловые системы (ext3/ext4, xfs, btrfs, reiserfs, jfs, vfat, ntfs ), а также сетевые файловые системы, такие как Samba и NFS.