« FlyBack sur Ubuntu 8.04.1 | Home | crypto/padlock-aes.ko warning »
tests et bash
posté par cep le 18 septembre 2008
À l’usage des débutants, différentes façons de comparer en bash si un fichier est plus ancien qu’un autre au moyen des opérateurs
-nt : teste si un fichier est plus récent qu’un autre fichier
-ot : teste si un fichier est plus ancien qu’un autre
On crée un fichier ancien dont la date de création sera le 17 janvier 2008, et un fichier nouveau portant la date actuelle :
$ touch -t 01171230 ancien $ touch nouveau $ ll total 0 -rw-r--r-- 1 cep cep 0 jan 17 2008 ancien -rw-r--r-- 1 cep cep 0 sep 17 16:53 nouveau
Avec la commande test on vérifie si nouveau est plus récent que ancien, et suivant le cas on affiche vrai ou faux
$ test nouveau -nt ancien && echo vrai ||echo faux vrai $ test nouveau -ot ancien && echo vrai ||echo faux faux $ test ancien -nt nouveau && echo vrai ||echo faux faux
On remplace echo vrai ou faux par l’équivalent $? qui va renvoyer 0 = vrai ou 1 = faux
$ test ancien -nt nouveau ; echo $? 1 $ test ancien -ot nouveau ; echo $? 0
On peut avoir le même résultat en remplaçant test par les [ ]
$ [ ancien -nt nouveau ];echo $? 1 $ [ nouveau -nt ancien ];echo $? 0
Pour d’autres options de tests, voir man bash.
cep

23 septembre 2008 at 19:54
Juste un petit détail :
j’ai pas lu la man de touch (peut etre le devrais-je) mais sur la PC BSD virtualisée sur laquelle je suis en train de jouer et sur laquelle ej veins de faire ta série de tests, et bien pour la création du fichier ancien, il faut faire :
touch -t 01171230 ancien
Si non, si on fait :
touch ancien -t 01171230
on se retrouve avec 3 fichiers :
$ls
ancien
-t
01171230
23 septembre 2008 at 21:25
Bon, et bien j’aurai du lire avant d’écrire…
Sous Fedora, tout marche corerctement quand on fait ce que tu dis.
Cela doit être une différence entre Linux et PCBSD ou alors venir de ma machine virtuelle, qui sait ?
24 septembre 2008 at 8:07
Non, tu as raison en partie.
Il est plus logique de mettre l’option avant le nom du fichier.
Je rectifie.
Merci Alexandre.
24 septembre 2008 at 13:31
Bonjour, je reviens la dessus car ce matin, sous la douche, j’ai pensé à une autre petite chose que je viens de tester. Le cas particulier ou tu veux tester 2 fichiers qui ont la même date.
Dans ce cas, tous les tests croisés donnent le résultat 1, cad faux. (tests croisés : nouveaubis -nt nouveau, nouveau -nt nouveaubis, nouveaubis -ot nouveau, nouveau -ot nouveaubis)
Donc, ultime précision, il faut faire au munimum deux tests pour être sur du résultat :
* Soit on garde les deux fichiers à leur place et on fait deux test avec -nt ET -ot
* Soit on garde -nt OU -ot ET on change les deux fichiers de place.
De cette façon, si on obtient toujours 1, les deux fichiers ont la même date, si on obtien 1 et 0 ou 0 et 1, alors on peut déduire lequel est plus ancien.
Merci de ta patience, je squatte ton blog et j’ai honte, mais le maître à dit : “c’est bon la honte”.
Sinon, une idée du pourquoi sous linux la syntaxe des commandes* est “laxiste” et pas sous PCBSD ? ça viendrait du shell utilisé ? ou de ma virtualisation ? c’est une PCBSD 7 béta 1, ça peut-être une explication ?…
*je dis des commandes car ça marche aussi avec ls (ls /bin -la fonctionne) et j’en tire une généralisation.
24 septembre 2008 at 14:32
Bonjour Alexandre,
Oui, en effet, le cas pourrait se poser, et dans ce cas le solutionner comme tu l’indiques.
Cependant, malgré ce que pourrait laisser penser la démonstration faite plus haut, en règle générale les comparaisons se font non pas sur la date de création mais la date de modification du fichier. Ce qui limite les risques de dates semblables, sans les supprimer totalement, comme tu le fais remarquer.
Un petit exemple avec la commande find -never qui fonctionne un peu sur le même principe :
$ touch un deux ;ll
total 0
-rw-r–r– 1 sidcep sidcep 0 sep 24 15:24 deux
-rw-r–r– 1 sidcep sidcep 0 sep 24 15:24 un
$ find . -newer un -name deux
$ find . -cnewer un -name deux
$ find . -cnewer deux -name un
$ nano -w un
$ find . -cnewer deux -name un
./un
Pour ce qui est de la différence avec le bash bsd, je n’ai pas d’explication. Je t’avoue que j’avais mis l’option après le nom du fichier simplement parce que j’avais oublié de le faire avant.