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?


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».


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 ];

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" ]

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.