как проверить в bash, был ли файл создан более х раз назад? - PullRequest
85 голосов
/ 16 февраля 2009

Я хочу проверить в linux bash, был ли файл создан более х раз назад.

допустим, файл называется text.txt, а время составляет 2 часа.

 if [ what? ]
 then
     echo "old enough"
 fi

Ответы [ 7 ]

114 голосов
/ 16 февраля 2009

Только за время модификации

if test `find "text.txt" -mmin +120`
then
    echo old enough
fi

Или то же самое в одной строке:

#!/bin/bash
find text.txt -mmin +120 -exec echo "old enough" \;

Вы можете использовать -cmin для изменения или -amin для времени доступа. Как отмечали другие, я не думаю, что вы можете отследить время создания.

38 голосов
/ 08 марта 2012

Мне всегда нравилось использовать date -r /the/file +%s, чтобы найти его возраст.

Вы также можете сделать touch --date '2015-10-10 9:55' /tmp/file, чтобы получить чрезвычайно детализированное время в произвольную дату / время.

18 голосов
/ 09 сентября 2009

Используя stat, чтобы выяснить дату последней модификации файла, date, чтобы выяснить текущее время и либеральное использование bashisms, можно выполнить желаемый тест на основе времени последней модификации файла. 1 .

if [ "$(( $(date +"%s") - $(stat -c "%Y" $somefile) ))" -gt "7200" ]; then
   echo "$somefile is older then 2 hours"
fi

Хотя код немного менее читабелен, чем подход find, я думаю, что он лучше, чем запуск find для просмотра файла, который вы уже «нашли». Кроме того, манипулирование датами - это весело; -)


  1. Как правильно заметил Фил, время создания не записывается, но используйте %Z вместо %Y ниже, чтобы получить "время изменения", которое может быть тем, что вы хотите.

[Update]

Для пользователей Mac используйте stat -f "%m" $somefile вместо приведенного выше специфического синтаксиса Linux

16 голосов
/ 16 февраля 2009

Время создания не сохраняется.

Сохраняются три метки времени (как правило, они могут быть отключены в определенных файловых системах или с помощью определенных параметров файловой системы):

  • Время последнего доступа
  • Время последнего изменения
  • Время последнего изменения

a «Изменение» в файле считается изменением прав, переименованием и т. Д. Пока изменение является только содержимым.

13 голосов
/ 25 марта 2011

Хотя ctime не является технически временем создания, это довольно часто.

Поскольку на ctime не влияют изменения содержимого файла, он обычно обновляется только при создании файла. И да - я слышу, как вы все кричите - он также обновляется, если вы меняете права доступа или владельца ... но обычно это делается один раз, обычно в то же время, когда вы помещаете файл туда.

Лично я всегда использую mtime для всего, и я думаю, что это то, что вы хотите. Но в любом случае ... вот перефразировка "непривлекательного" удара Гусса в простой в использовании функции.

#!/bin/bash
function age() {
   local filename=$1
   local changed=`stat -c %Y "$filename"`
   local now=`date +%s`
   local elapsed

   let elapsed=now-changed
   echo $elapsed
}

file="/"
echo The age of $file is $(age "$file") seconds.
6 голосов
/ 06 мая 2013

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

date -d "now - $( stat -c "%Y" $filename ) seconds" +%s

с использованием даты GNU

3 голосов
/ 16 февраля 2009

Рассмотрим результат инструмента 'stat':

  File: `infolog.txt'
  Size: 694         Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d  Inode: 11635578    Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/     fdr)   Gid: ( 1000/     fdr)
Access: 2009-01-01 22:04:15.000000000 -0800
Modify: 2009-01-01 22:05:05.000000000 -0800
Change: 2009-01-01 22:05:05.000000000 -0800

Здесь вы можете увидеть три даты доступа / изменения / изменения. Здесь нет Дата создания. Вы действительно можете быть уверены, когда содержимое файла изменено (поле «изменить») или изменен его индекс («изменено») поле).

Примеры обновления обоих полей:

«Изменить» будет обновлено, если кто-то объединит дополнительную информацию с конец файла.

«Изменение» будет обновлено, если кто-то изменил права доступа через chmod.

...