Найти все файлы с (поврежденной) датой будущего и изменить на сегодняшний день

231 из нескольких тысяч файлов в иерархии папок имеют неправильные (нулевые?) Даты создания и изменения. Я могу идентифицировать их:

find . -mtime -0

И их даты все хорошо в будущем. Не совсем точно, но те немногие, с которыми я смотрел ls -l как представляется, в 2040 году.

В любом случае, я бы хотел, чтобы 1-е отображение даты создания и модификации в выводе вышеприведенной команды, если это возможно.

Во-вторых, и что более важно, я хотел бы изменить даты создания и изменения этих файлов на сегодня (сейчас).

Я не большой гуру Баш, но я знаю, что есть простой способ. Заранее спасибо!

1 ответ

Я бы использовал "find" следующим образом и exec "touch", чтобы установить дату изменения:

find . -mtime -0 -exec touch {} \;

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

Вы можете использовать "ls -Ul" для даты создания файла и "ls -l" для времени изменения, например:

find .-mtime -0 -exec ls -Ul {} \;

или же

find .-mtime -0 -exec ls -l {} \;

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

В качестве примера вот fstab с неправильной меткой времени:

$ stat /etc/fstab
  File: '/etc/fstab'
  Size: 37          Blocks: 8          IO Block: 4096   regular file
Device: b30ah/45834d    Inode: 504         Links: 1
Access: (0644/-rw-r--r--)  Uid: (    1000/    user)   Gid: (    0/    user)
Access: 2105-12-20 17:23:10.624000001 +0000
Modify: 2018-07-31 00:29:37.000000000 +0000
Change: 2020-01-21 08:58:48.779991299 +0000
 Birth: -



$ sudo cp  /etc/fstab /etc/fstab_  --preserve=ownership --preserve=mode
$ sudo mv  /etc/fstab_ /etc/fstab



$ stat /etc/fstab
  File: '/etc/fstab'
  Size: 37          Blocks: 8          IO Block: 4096   regular file
Device: b30ah/45834d    Inode: 1534        Links: 1
Access: (0644/-rw-r--r--)  Uid: (    1000/    user)   Gid: (    1000/    user)
Access: 2020-02-06 16:52:33.684297747 +0000
Modify: 2020-02-06 16:52:33.684297747 +0000
Change: 2020-02-06 16:52:43.093550721 +0000
 Birth: -
$ 

В наборе команд из двух строк это будет:

$ sudo find /  -type f -newermt 2020-02-07 -exec cp {} {}_ --preserve=ownership -preserve=mode  \;

Затем найдите скопированные файлы и верните их на место.

$ sudo find /  -type f -iname "*_"  -exec mv {}_ {}   \;

Вы можете проверить даты с помощью следующей команды:

$ sudo find /  -type f -newermt 2020-02-07

Примечание. В качестве завершающего символа я выбрал "_", пожалуйста, адаптируйте его к вашим потребностям, чтобы избежать конфликтов в вашей файловой системе.

Другие вопросы по тегам