Как я пишу сценарий, чтобы определить, является ли файл более старым, чем 30 минут в/bin/sh?
К сожалению, не делает stat
команда существует в системе. Это - старая система Unix, http://en.wikipedia.org/wiki/Interactive_Unix
Perl, к сожалению, не установлен в системе, и клиент не хочет устанавливать его, и ничто иное также.
Вот один из способов использования find
.
if test "`find file -mmin +30`"
Команда find
должна быть процитирована в том случае, если файл, о котором идет речь, содержит пробелы или специальные символы.
Ниже приведена информация о возрасте файла в секундах:
echo $(( `date +%s` - `stat -L --format %Y $filename` ))
что означает, что это должно давать значение true/false value (1/0) для файлов старше 30 минут:
echo $(( (`date +%s` - `stat -L --format %Y $filename`) > (30*60) ))
30*60
-- 60 секунд в минуту, не вычисляйте, пусть процессор сделает работу за вас!
Если вы пишете скрипт sh, то самый полезный способ - это использовать test
с уже упомянутым трюком со статистикой:
if [ `stat --format=%Y $file` -le $(( `date +%s` - 1800 )) ]; then
do stuff with your 30-minutes-old $file
fi
Обратите внимание, что [
является символической ссылкой (или эквивалентной) на тест
; см. man test
, но имейте в виду, что test
и [
также являются bash builtins и, таким образом, могут иметь несколько иное поведение. (Также обратите внимание на команду [[
bash-комбинация).
] Хорошо, никакой статистики и калечащей находки. Вот ваши альтернативы: [
] [] Скомпилируйте [] GNU coreutils [], чтобы получить приличную находку (и множество других полезных команд). Возможно, у вас уже есть gfind. [
]. [] Может быть, вы можете использовать [] дату [
], чтобы получить время модификации файла, если []-r[
] работает?[
(`date +%s` - `date -r $file +%s`) > (30*60)
]
[] В качестве альтернативы, используйте сравнение []-nt[
], чтобы выбрать, какой файл более новый, проблема заключается в том, чтобы сделать файл с временем мода 30 минут в прошлом. Обычно это можно сделать с помощью []-nt[
], но все ставки отменяются.[
touch -d '30 minutes ago' 30_minutes_ago
if [ your_file -ot 30_minutes_ago ]; then
...do stuff...
fi
]
[] И, наконец, посмотрите, доступен ли Perl, а не боритесь с тем, кто знает, какие версии утилит оболочки.[
] [use File::stat;
print "Yes" if (time - stat("yourfile")->mtime) > 60*30;
] ]Это можно сделать путем сравнения со справочным файлом, который вы создали с отметкой времени тридцать минут назад.[
] []Сначала создайте файл сравнения, введя[
] [touch -t YYYYMMDDhhmm.ss /tmp/thirty_minutes_ago
]
[]заменив отметку времени на значение тридцать минут назад. Вы можете автоматизировать этот шаг с помощью тривиального одного вкладыша в Perl.[
] []Затем используйте оператор find's newer для сравнения файлов, которые старше, отрицая оператор search[
] [find . \! -newer /tmp/thirty_minutes_ago -print
] ] Что значит [] старше 30 минут []: [] модифицированный более 30 минут назад[], или [] созданный более 30 минут назад[]? Надеюсь, что это первое, так как ответы до сих пор верны для этой интерпретации. Во втором случае у Вас возникнут проблемы, так как unix-файловые системы не отслеживают время создания файла. (Записи атрибута файла []ctime[
], когда в последний раз изменялось содержимое []inode[], т.е. произошло что-то вроде []chmod[
] или []chown[
]). [
] Если вам действительно нужно знать, был ли файл создан более 30 минут назад, вы должны либо просканировать соответствующую часть файловой системы многократно с чем-то вроде [] найти [
], либо использовать что-то платформозависимое, например [] inotify[].[