Определение возраста файла в сценарии оболочки - PullRequest
10 голосов
/ 09 июня 2009

G'day,

Мне нужно посмотреть, не устарел ли конкретный файл более 58 минут из сценария оболочки sh. Кажется, я говорю о ванильной оболочке Solaris с некоторыми расширениями POSIX.

Я думал о

touch -t YYYYMMDDHHmm.SS /var/tmp/toto

где отметка времени 58 минут назад и затем

find ./logs_dir \! -newer /var/tmp/toto -print

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

Любые предложения с благодарностью получены.

ура

Ответы [ 6 ]

17 голосов
/ 01 марта 2012

Мне нужно было что-то проверить, чтобы проверить возраст конкретного файла, чтобы не загружать его слишком часто. Таким образом, используя GNU date и bash:

# if file's modtime hour is less than current hour:
[[ $(date +%k -r GPW/mstall.zip) -lt $(date +%k) ]] && \
wget -S -N \
http://bossa.pl/pub/metastock/mstock/mstall.zip \

Обновление - эта версия работает намного лучше для меня, и является более точной и понятной:

[[ $(date +%s -r mstall.zip) -lt $(date +%s --date="77 min ago") ]] && echo File is older than 1hr 17min

Вариант BSD (протестирован на Mac):

[[ $(stat -f "%m" mstall.zip) -lt $(date -j -v-77M +%s) ]] && echo File is older than 1hr 17min
11 голосов
/ 09 июня 2009

Вы можете использовать разные единицы в команде поиска, например:

find . -mtime +0h55m

Возвращает любые файлы с датами изменения старше 55 минут назад.

4 голосов
/ 09 июня 2009

Часть головоломки может использовать stat. Вы можете передать -r или -s, чтобы получить анализируемое представление всех метаданных файла.

find . -print -exec stat -r '{}' \;

AFAICR, в 10-м столбце будет показано время mtime.

2 голосов
/ 28 мая 2013

Это старый вопрос, извините, но ради других людей, которые искали хорошее решение, как я ...

Лучший способ, который я могу придумать, - это использовать команду find (1) , которая является единственной из известных мне команд Un * x, которая может напрямую проверять возраст файла:

if [ "$(find $file -mmin +58)" != "" ]
then
  ... regenerate the file ...
fi

Другой вариант - использовать команду stat (1) для возврата возраста файла в секундах и команду date для возврата времени в секундах. В сочетании с математическим оператором bash shell определение возраста файла становится довольно простым:

age=$(stat -c %Y $file)
now=$(date +"%s")
if (( (now - age) > (58 * 60) ))
then
    ... regenerate the file ...
fi

Вы могли бы сделать вышеупомянутое без двух переменных, но они проясняют ситуацию, как и использование bash math (которое также можно заменить). В течение многих лет я довольно широко использовал метод find (1) в сценариях и рекомендую его, если вам не нужно знать возраст в секундах.

1 голос
/ 09 июня 2009

Поскольку вы хотите проверить время конкретного файла, вы можете начать с использования test и сравнить его со специально созданным файлом:

test /path/to/file -nt /var/tmp/toto

или

touch -t YYYYMMDDHHmm.SS /var/tmp/toto
if [/path/to/file -nt /var/tmp/toto]
   ...
0 голосов
/ 02 июня 2011

Вы также можете использовать ls и awk, чтобы получить то, что вам нужно. В Awk есть функция printf, которая позволит вам форматировать столбцы так, как вы захотите.

Я проверял это в bash на linux и ksh на солярисе.

Поиграйте с опциями, чтобы получить наилучшие значения для вашего приложения. Особенно "--full-time" в bash и "-E" в ksh.

Баш

ls -l foo | awk '{printf "%3s %1s\n", $6, $7}'

2011-04-19 11: 37

ls --full-time foo | awk '{printf "%3s %1s\n", $6, $7}'

2011-04-19 11: 37: 51.211982332

КШ

ls -l bar | awk '{printf "%3s %1s %s\n", $6, $7, $8}'

3 мая 11: 19

ls -E bar | awk '{printf "%3s %1s %s\n", $6, $7, $8}'

2011-05-03 11: 19: 23.723044000 -0400

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...