Я хочу проверить в linux bash, был ли файл создан более x раз назад.
скажем, файл называется text.txt и время составляет 2 часа.
if [ what? ]
then
echo "old enough"
fi
linux
bash
command-line
облет
источник
источник
find
вернул ненулевое значение, когда совпадений не найдено.text.txt
предполагается, что это не каталог.[ "$(find path/to/file -mmin +120)" ] && echo "it is old"
Мне всегда нравилось использовать,
date -r /the/file +%s
чтобы узнать свой возраст.Вы также можете сделать
touch --date '2015-10-10 9:55' /tmp/file
очень точное время в произвольную дату / время.источник
let AGE=$(($(date +%s)-$(date -r /path/to/file +%s)))
[с допущением, что создавалось и никогда неfunction file-age { FILE_CREATED_TIME=`date -r "$1" +%s`; TIME_NOW=`date +%s`; echo "$[ ${TIME_NOW} - ${FILE_CREATED_TIME} ]"; }
$[ ]
есть, если оно не устарело , то по крайней мере устаревшее и менее переносимое , и$(( ))
вместо него следует использовать ; и обратные кавычки более хрупкие, чем$( )
; а также дефисы в именах функций могут быть не полностью переносимы. Но суть в этом хорошая!Используя
stat
для определения даты последней модификации файла,date
для определения текущего времени и свободного использования bashisms, можно выполнить тест, который вы хотите, на основе времени последнего изменения файла 1 .Хотя код немного менее читабелен, чем этот
find
подход, я думаю, что это лучший подход, чемfind
просмотр файла, который вы уже «нашли». Кроме того, манипуляции с датами - это весело ;-)%Z
вместо этого,%Y
указанное ниже, чтобы получить «время изменения», которое может быть тем, что вы хотите.[Обновить]
Для пользователей Mac используйте
stat -f "%m" $somefile
вместо синтаксиса Linux, указанного вышеисточник
stat
не встроен - очень плохо с моей стороны, исправлю.Время создания не сохраняется.
В памяти хранятся три метки времени (обычно они могут быть отключены в определенных файловых системах или с помощью определенных параметров файловой системы):
«Изменение» файла засчитывается как изменение разрешений, переименование и т. д. Хотя изменение относится только к содержимому.
источник
Хотя ctime технически не является временем создания, это довольно часто бывает.
Поскольку ctime на него не влияют изменения содержимого файла, обычно оно обновляется только при создании файла. И да - я слышу, как вы все кричите - он также обновляется, если вы меняете права доступа или владельца ... но обычно это то, что делается один раз, обычно в то же время, когда вы помещаете туда файл.
Лично я всегда использую mtime для всего, и я думаю, что это то, что вы хотите. Но в любом случае ... вот переработка «непривлекательного» bash Гуса в простой в использовании функции.
источник
local changed=$(perl -MFile::stat -e "print stat(\"${filename}\")->mtime")
superuser.com/questions/427551/…chmod
, примененная к файлу, сводит на нет эту идею. Но я могу жить с тобой, делая это ;-)+%s
из виду второй таймage() { echo $(( $(date +%s) - $(date -r "$1" +%s) )); }
(Спасибо @Grizly за исправление!)noatime
опцией (что хорошо для производительности, поэтому вы должны использовать его). Так что просто используйте%X
вместо%Y
.Найти один хороший, но я думаю, вы можете использовать другой способ, особенно если вам нужно сейчас, сколько секунд старый файл
date -d "now - $( stat -c "%Y" $filename ) seconds" +%s
используя дату GNU
источник
Рассмотрим результат работы инструмента stat:
Здесь вы можете увидеть три даты для доступа / изменения / изменения. Дата создания отсутствует. Вы можете быть уверены только в том, что содержимое файла было изменено (поле «изменить») или его индексный дескриптор (поле «изменить»).
Примеры обновления обоих полей:
«Изменить» будет обновлено, если кто-то добавил дополнительную информацию в конец файла.
«Изменить» будет обновлено, если кто-то изменил права доступа через chmod.
источник
я использую
источник