Как я могу проверить bash, был ли файл создан больше, чем x назад?

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

скажем, файл называется text.txt, а время - 2 часа.

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

Ответ 1

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

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 для времени доступа. Как указывали другие, я не думаю, что вы можете отслеживать время создания.

Ответ 2

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

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

Ответ 3

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

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

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

a "Изменить" на файл считается изменением прав, переименованием и т.д. Хотя модификация является только содержанием.

Ответ 4

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

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

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

#!/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.

Ответ 5

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

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

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


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

[Обновление]

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

Ответ 6

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

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

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

Ответ 7

Рассмотрим результат инструмента "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.