Comment puis-je vérifier 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.

Disons que le fichier s’appelle text.txt et que l’heure est 2 heures.

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

Seulement pour l’heure de modification

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

Ou même dans 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’access. Comme d’autres l’ont souligné, je ne pense pas que vous puissiez suivre le temps de création.

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

Vous pouvez également faire touch --date '2015-10-10 9:55' /tmp/file pour obtenir une heure extrêmement fine sur une date / heure arbitraire.

L’heure de création n’est pas stockée.

Ce qui est stocké sont trois horodatages (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 temps d’access
  • Heure de la dernière modification
  • Heure du dernier changement

une “modification” du fichier est comptabilisée comme modification, renommage, etc. Si la modification concerne uniquement le contenu.

En utilisant la stat pour déterminer la date de la dernière modification du fichier, la date pour déterminer l’heure actuelle et une utilisation généralisée des sommaires, on peut effectuer le test souhaité en fonction de l’heure de dernière modification du fichier 1 .

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

Alors que le code est un peu moins lisible que l’approche find , je pense que c’est une meilleure approche que de lancer find pour regarder un fichier que vous avez déjà trouvé. En outre, la manipulation des dates est amusante 😉


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

[Mettre à jour]

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

Bien que ctime ne soit pas techniquement le moment de la création, c’est souvent le cas.

Comme ctime n’est pas affecté par les modifications apscopes au contenu du fichier, il n’est généralement mis à jour que lorsque le fichier est créé. Et oui – je peux vous entendre tous crier – il est également mis à jour si vous modifiez les droits d’access ou la propriété… mais en général, c’est quelque chose qui est fait une fois, généralement en même temps que vous placez le fichier.

Personnellement, j’utilise toujours mtime pour tout, et j’imagine que c’est ce que vous voulez. Mais de toute façon, voici un résumé du “non-attractif” bash de Guss, dans une fonction facile à utiliser.

 #! / bin / bash
 fonction age () {
    nom de fichier local = 1 $
    local changé = `stat -c% Y" $ filename "`
    local now = `date +% s`
    local écoulé

    laisser s'écouler = maintenant changé
    echo $ écoulé
 }

 file = "/"
 echo L'âge de $ file est $ (age "$ file") secondes.

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

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

en utilisant la date GNU

Considérons 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 d’access / modification / modification. Il n’y a pas de date de création. Vous ne pouvez vraiment être sûr que lorsque le contenu du fichier a été modifié (le champ “modifier”) ou que son inode a été modifié (le champ “Modifier”).

Exemples de mise à jour des deux champs:

“Modifier” sera mis à jour si quelqu’un a concaténé des informations supplémentaires à la fin du fichier.

“Change” sera mis à jour si quelqu’un a modifié les permissions via chmod.