Comment vérifier que le fichier2 est plus récent que le fichier1 en bash?


51

Comment puis-je vérifier que cela a file2été modifié pour la dernière fois file1?

Dans cet exemple, a perlété modifié plus récemment que stack. Existe-t-il une commande bash ou Linux permettant de comparer ces fichiers en fonction de l'heure de modification?

-rw-r--r--    1 root     root         1577 Sep  7 22:55 stack
-rwxr-xr-x    1 root     root          626 Sep  7 23:10 perl

Réponses:


51

Trouvé ici

for f in /abcd/xyz* do
   [ "$f" -nt /abcd/test.txt ] && echo "file f$ found" done

14
Aussi -otest "plus vieux que".
Dennis Williamson

1
Je pense que je viens de rencontrer un problème avec cela. Pour les fichiers avec le même temps de modification, exprimé en secondes, ils ont le "même" âge pour ces tests; -nt et -ot donnent le même résultat (false). Dans mon cas d'utilisation, un programme lit les autres sorties et je dois m'assurer qu'elles ont été exécutées dans le bon ordre. Dans ce cas, il semble nécessaire de comparer des nanosecondes.
sjmc

38
if [[ FILE1 -nt FILE2 ]]; then
  echo FILE1 is newer than FILE2
fi

Tiré de 'l' homme test '. Extrait:

FILE1 -nt FILE2
  FILE1 is newer (modification date) than FILE2

7

Une autre façon de faire ceci:

find -name file2 -newer file1

retournera null si file2 est plus vieux ou a le même âge que file1. Il renverra le nom (et le répertoire) de file2 s'il est plus récent.

Sachez que Linux ne garde pas trace du moment où les fichiers ont été créés. Ces tests porteront sur la date et l'heure de la modification la plus récente.


2
Linux garde trace du temps de création: il s’appelle ctime. Il garde également une trace de la dernière heure d'accès: atime. Il utilise simplement mtime en général car il s’agit de la dernière modification, ce qui est le plus utile.
Coroos

2
@Coroos: ce ctimen'est pas le moment de la création. Il s'agit de l'heure de changement d'inode et est mise à jour lorsque les attributs du fichier, tels que le propriétaire ou les autorisations, sont modifiés ou que vous modifiez le fichier. Certains systèmes de fichiers prennent en charge l’heure de naissance, mais pas le noyau. Stat montre une heure de naissance vide. Voir unix.stackexchange.com/a/91200 Notez que OS X prend en charge l'heure de naissancestat -f %SB filename
Dennis Williamson

Voir également htrp: //unix.stackexchange.com/a/50184 pour savoir comment utiliser debugfspour voir l'heure de création (naissance) sous Linux.
Dennis Williamson

2

Si vous souhaitez des informations plus détaillées, vous pouvez utiliser la statcommande

<tbielawa>@(fridge)[~/SuperUser] 03:15:10
$ touch firstFile
<tbielawa>@(fridge)[~/SuperUser] 03:15:24
$ touch secondFile
<tbielawa>@(fridge)[~/SuperUser] 03:15:45
$ stat firstFile 
  File: `firstFile'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 805h/2053d  Inode: 151528      Links: 1
Access: (0644/-rw-r--r--)  Uid: (  500/tbielawa)   Gid: (  500/tbielawa)
Access: 2010-09-14 03:15:24.938721003 -0400
Modify: 2010-09-14 03:15:24.938721003 -0400
Change: 2010-09-14 03:15:24.938721003 -0400
<tbielawa>@(fridge)[~/SuperUser] 03:15:48
$ stat secondFile 
  File: `secondFile'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 805h/2053d  Inode: 151529      Links: 1
Access: (0644/-rw-r--r--)  Uid: (  500/tbielawa)   Gid: (  500/tbielawa)
Access: 2010-09-14 03:15:45.074722792 -0400
Modify: 2010-09-14 03:15:45.074722792 -0400
Change: 2010-09-14 03:15:45.074722792 -0400

2
echo $(($(date -r file1 +%s)-$(date -r file2 +%s)))
2208

Si le résultat est> 0, le premier fichier est plus récent. (Plus récent en termes de dernière modification-, pas de création-heure, qui est stocké sur Linux).


-nt est généralement mieux, mais c'est toujours un poste utile ...
BuvinJ

0

Selon ce lien, Unix ne stocke pas la date de création. http://www.issociate.de/board/post/302628/How_to_check_file_creation_date.html

Mais stocke le dernier accès.

pour le dernier accès

 ls -t  # displays in order of date. So the first one is the 

ls affiche chaque fichier sur une nouvelle ligne.

alors ls -t affiche le dernier fichier sur la première ligne, etc.

  • Vous pouvez utiliser vous-même pour choisir la première ligne.
  • Vous pouvez utiliser sed pour choisir la première ligne.

    ls -t php.exe php.ini | sed -n '1p' php.ini

pourrait faire -lt si vous verrez que si vous ne spécifiez pas de fichiers .. et il ne le répertoire .. il donne le total sur la première ligne, de sorte que vous choisissez la deuxième ligne comme$ls -lt | sed -n '2p'

Un bon serait

ls -t | head -n 1

ou

ls -lt | head   

affiche les 10 premières lignes du premier fichier de la commande modifié en premier et vous pouvez voir lequel il est


-test le temps de modification; -uest le temps d'accès
Dennis Williamson

merci .. je me demandais à propos de -u .. la distinction .. et oui comme vous le suggérez .. -t et -u ordonné par le temps .. comme l'homme l'a. mieux que de le dire commandes par date.
Barlop

mais peut-être pas aussi bon que de dire ordonné par date / heure ;-)
barlop

0

Voici un petit script, j'ai fait:

mtf0=`stat -c %Y file0`    
mtf1=`stat -c %Y file1`    
dt=$(( mtf1 - mtf0 ))    
[[ $dt -gt 0 ]] && echo "File F1 is newer than file F0 "

Vous devriez expliquer plus en détail ce que cela fait avec certaines références de la commande afin que les personnes qui l'utilisent aient la possibilité de lire ou d'expliquer ce que vous dites, décrivez davantage les commandes et la syntaxe.
Pimp Juice IT
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.