Как сравнить временные метки файлов в 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

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

newcoderintown
источник
1
Вашему коду нужны пробелы в квадратных скобках.
Джонатан Леффлер
Механизм тестирования очень сложен по сравнению со встроенным механизмом сравнения отметок времени.
Джонатан Леффлер

Ответы:

26

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

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

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

Джонатан Леффлер
источник
5

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

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

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

if [ "$file1time" -gt "$file2time" ]
Игнасио Васкес-Абрамс
источник
0
if ( [ $file1time -gt $file2time ] );
then
 doSomething
fi                                                                    
user328064
источник