web-dev-qa-db-fra.com

comment puis-je vérifier dans bash si un fichier a été créé il y a plus de x fois?

Je veux vérifier dans linux bash si un fichier a été créé il y a plus de x fois.

supposons que le fichier s'appelle text.txt et qu'il dure 2 heures.

 if [ what? ]
 then
     echo "old enough"
 fi
90
flybywire

Seulement pour le temps de modification

if test `find "text.txt" -mmin +120`
then
    echo old enough
fi

Ou le même en une ligne:

#!/bin/bash
find text.txt -mmin +120 -exec echo "old enough" \;

Vous pouvez utiliser -cmin pour le changement ou -amin pour le temps d'accès. Comme d'autres l'ont souligné, je ne pense pas que vous puissiez suivre le temps de création.

120
kmkaplan

J'ai toujours aimé utiliser date -r /the/file +%s pour trouver son âge.

Vous pouvez aussi faire touch --date '2015-10-10 9:55' /tmp/file pour obtenir un temps extrêmement précis avec une date/heure arbitraire.

39
nemik

En utilisant stat pour déterminer la date de dernière modification du fichier, date pour connaître l'heure actuelle et une utilisation généreuse des bashismes, vous pouvez effectuer le test souhaité en fonction du fichier. heure de dernière modification1.

if [ "$(( $(date +"%s") - $(stat -c "%Y" $somefile) ))" -gt "7200" ]; then
   echo "$somefile is older then 2 hours"
fi

Bien que le code soit un peu moins lisible que l’approche find, je pense que c’est une meilleure approche que de lancer find pour examiner un fichier que vous avez déjà "trouvé". En outre, la manipulation de la date est amusant ;-)


  1. Comme Phil a correctement noté l'heure de création n'est pas enregistrée, utilisez %Z au lieu de %Y ci-dessous pour obtenir le "changement de temps" qui peut être ce que vous voulez.

[Mise à jour]

Pour les utilisateurs de mac, utilisez stat -f "%m" $somefile au lieu de la syntaxe spécifique à Linux ci-dessus

20
Guss

L'heure de création n'est pas enregistrée.

Trois horodatages sont stockés (généralement, ils peuvent être désactivés sur certains systèmes de fichiers ou par certaines options du système de fichiers):

  • Dernier accès
  • Dernière heure de modification
  • Dernier changement heure

un "changement" dans le fichier est considéré comme une modification d'autorisation, un changement de nom, etc. Bien que la modification concerne uniquement le contenu.

16
Philip Reynolds

Bien que ctime ne soit pas techniquement le temps de la création, il l'est assez souvent.

Depuis ctime, il n’est pas affecté par les modifications apportées au contenu du fichier. Il est généralement mis à jour uniquement lors de la création du fichier. Et oui - je vous entends tous crier - il est également mis à jour si vous modifiez les autorisations d'accès ou la propriété ... mais généralement, c'est quelque chose qui est fait une fois, généralement en même temps que vous déposez le fichier là-bas.

Personnellement, j'utilise toujours mtime pour tout, et j'imagine que c'est ce que vous voulez. Quoi qu'il en soit, voici un résumé de la bash "peu attrayante" de Guss, dans une fonction facile à utiliser.

 #!/bin/bash 
 fonction age () {
 nomfichier local = $ 1 
 local modifié = `stat -c% Y" $ nomfichier "` 
 local maintenant = `date +% s` 
 local écoulé 
 
 laisser écoulé = maintenant modifié 
 echo $ écoulé 
} 
 
 file = "/" 
 echo L'âge de $ fichier est $ (age "$ fichier") secondes. 
13
Maryam Jeddian

La recherche est bonne mais je pense que vous pouvez utiliser une autre manière, surtout si vous devez maintenant combien de secondes le fichier est vieux

date -d "now - $( stat -c "%Y" $filename ) seconds" +%s

en utilisant GNU date

6
Vide

Considérez le résultat de l'outil 'stat':

  File: `infolog.txt'
  Size: 694         Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d  Inode: 11635578    Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/     fdr)   Gid: ( 1000/     fdr)
Access: 2009-01-01 22:04:15.000000000 -0800
Modify: 2009-01-01 22:05:05.000000000 -0800
Change: 2009-01-01 22:05:05.000000000 -0800

Vous pouvez voir ici les trois dates pour l'accès/modifier/changer. Il n'y a pas de date de création. Vous ne pouvez être vraiment sûr que du moment où le contenu du fichier a été modifié (le champ "modifier") ou de son inode modifié (le champ "changer").

Exemples de mise à jour des deux champs:

"Modifier" sera mis à jour si quelqu'un concatène des informations supplémentaires à la fin du fichier.

"Change" sera mis à jour si quelqu'un a changé les permissions via chmod.

3
fdr