Как сравнить временные метки файлов в bash?


16

Как сравнить временную метку двух файлов?

Я пробовал это, но это не работает:

file1time=`stat -c %Y fil1.txt`
file2time=`stat -c %Y file2.txt`
if[$file1time -gt $file2time];
then
 doSomething
fi

Я распечатал обе метки времени по порядку, и это дает мне

1273143480
1254144394
./script.sh: line 13: [1273143480: command not found

Так что в принципе, если сравнение не работает, я думаю. Или, если есть какой-то другой способ, отличный от того, что я делаю, пожалуйста, дайте мне знать. Что я должен изменить?


1
Вашему коду нужны пробелы в квадратных скобках.
Джонатан Леффлер

Механизм тестирования очень сложен по сравнению со встроенным механизмом сравнения отметок времени.
Джонатан Леффлер

Ответы:


26

Операторы для сравнения меток времени:

[ $file1 -nt $file2 ]
[ $file1 -ot $file2 ]

Мнемоника проста: «новее, чем» и «старше, чем».


5

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

if [ $file1time -gt $file2time ];

3
[тестовая команда - см. раздел «УСЛОВНЫЕ ВЫРАЖЕНИЯ» справочной bashстраницы. Существует также автономный исполняемый файл в /usr/bin/testи /usr/bin/[, но если вы используете bash и не используете полный путь, вы используете встроенную оболочку.
Даг Харрис

@ Дуг Харрис +1 для более полного объяснения темы.
Goedson

1

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

if [ "$file1time" -gt "$file2time" ]

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.