Comment comparer les horodatages des fichiers en bash?

16

Comment comparer l'horodatage de deux fichiers?

J'ai essayé mais ça ne marche pas:

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

J'ai imprimé les deux horodatages, dans l'ordre et ça me donne

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

Donc, fondamentalement, si la comparaison ne fonctionne pas, je suppose. Ou s'il y a une autre manière agréable que ce que je fais, faites-le moi savoir. Que dois-je changer?

newcoderintown
la source
1
Votre code a besoin d'espaces autour des crochets.
Jonathan Leffler
Le mécanisme de test est très complexe par rapport au mécanisme intégré de comparaison des horodatages.
Jonathan Leffler

Réponses:

26

Les opérateurs pour comparer les horodatages sont:

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

Le mnémonique est simple: «plus récent que» et «plus ancien que».

Jonathan Leffler
la source
5

Cela est dû à certains espaces manquants. [est une commande, elle doit donc avoir des espaces autour d'elle et ]est un paramètre spécial pour lui indiquer où se termine sa ligne de commande. Ainsi, votre ligne de test devrait ressembler à:

if [ $file1time -gt $file2time ];
goedson
la source
3
[est une commande de test - voir la section "EXPRESSIONS CONDITIONNELLES" de la bashpage de manuel. Il y a aussi un exécutable autonome dans /usr/bin/testet /usr/bin/[, mais si vous utilisez bash et n'utilisez pas le chemin complet, vous utilisez le shell intégré.
Doug Harris
@Doug Harris +1 pour l'explication plus complète sur le sujet.
goedson
1

ifn'est pas magique. Il tente d'exécuter la commande qui lui est transmise et vérifie si son état de sortie est nul. Il ne gère pas non plus les arguments inexistants, c'est pourquoi vous devez citer les variables qui y sont utilisées.

if [ "$file1time" -gt "$file2time" ]
Ignacio Vazquez-Abrams
la source
0
if ( [ $file1time -gt $file2time ] );
then
 doSomething
fi                                                                    
user328064
la source