obtenir l'âge du fichier donné

12

Comment puis-je obtenir l'âge d'un fichier donné en au moins quelques jours?

Je connais bien ls -lhles commandes similaires. Je veux quelque chose qui fonctionnera un peu comme ceci:

getfage <FILE> # prints out '12d' (12 days)

En outre, cela doit être quelque peu multiplateforme, car j'aimerais également l'utiliser sous Mac OS X, mais le cas d'utilisation principal est sur ma Linux-box.

REMARQUE

Puisque Linux ne suit pas le temps de création, je recherche une solution double: une pour mtime (linux) - c'est la dernière fois que ledit fichier a été modifié - et une pour Mac OS X, qui peut soit gérer mtime ou temps de création.

Alexej Magura
la source
@slm Cela concerne spécifiquement le temps de création, il ne va pas dans le calcul de l'âge sur la ligne de commande.
Gilles 'SO- arrête d'être méchant'
@terdon, pas vraiment. Voir ma NOTE ci-dessus.
Alexej Magura
@AlexejMagura et comment les réponses dans la dupe ne font-elles pas pour vous? statvous donne tout ce dont vous avez besoin?
terdon

Réponses:

16

Unix ne garde pas une date de création. Les seules informations disponibles sont généralement les dernières fois où les fichiers ont été:

  1. Accédé
  2. Modifié
  3. Modifié
  • Accès - la dernière fois que le fichier a été lu
  • Modifier - la dernière fois que le fichier a été modifié (le contenu a été modifié)
  • Modifier - la dernière fois que les métadonnées du fichier ont été modifiées (par exemple, les autorisations)

( De cette réponse )

Vous pouvez obtenir des dates liées à un fichier particulier à l'aide de la statcommande.

Exemple

$ stat ffmpeg 
  File: `ffmpeg'
  Size: 19579304    Blocks: 38248      IO Block: 4096   regular file
Device: fd02h/64770d    Inode: 10356770    Links: 1
Access: (0755/-rwxr-xr-x)  Uid: (  500/    saml)   Gid: (  501/    saml)
Access: 2013-11-26 10:49:09.908261694 -0500
Modify: 2013-11-02 17:05:13.357573854 -0400
Change: 2013-11-02 17:05:13.357573854 -0400

OSX et HFS

Si vous utilisez OSX, le système de fichiers utilisé sous Unix est HFS . C'est l'un des rares (à ma connaissance) qui conserve la date de création dans le système de fichiers, ainsi que l'heure de modification, etc. similaires aux autres Unix.

extrait

Un enregistrement de fichier stocke une variété de métadonnées sur le fichier, y compris son CNID, la taille du fichier, trois horodatages (lorsque le fichier a été créé, modifié pour la dernière fois, sauvegardé pour la dernière fois), les premières étendues de fichier des fourchettes et pointeurs de données et de ressources aux premiers enregistrements de données et d'étendue des ressources du fichier dans le fichier de dépassement de capacité. L'enregistrement de fichier stocke également deux champs de 16 octets qui sont utilisés par le Finder pour stocker des attributs sur le fichier, y compris des éléments comme son code créateur, le code de type, la fenêtre dans laquelle le fichier doit apparaître et son emplacement dans la fenêtre.

Horodatages

Les horodatages sont toujours conservés dans le système de fichiers, vous êtes donc limité par le suivi du temps qui leur est proposé (EXT3, EXT4, XFS, etc.).

Systèmes de fichiers

Si vous êtes curieux, jetez un œil à ce sujet de Wikipédia intitulé: Comparaison des systèmes de fichiers . Il contient la liste la plus complète de systèmes de fichiers que je connaisse, ainsi qu'un joli tableau des différentes fonctionnalités et l'état de leur prise en charge ou non dans un système de fichiers donné.

Les références

slm
la source
Merci pour la mise à jour, ça aide. En fait, j'ai lu ici que ext4 peut conserver les dates de création mais cela n'a pas encore été implémenté dans le noyau.
terdon
@terdon - oui, il est logique que certains systèmes de fichiers le prennent en charge. Cela me semble depuis longtemps, je comprends dans le passé pourquoi il a été laissé de côté, mais tout a tellement progressé depuis le début qu'il n'a pas de sens de ne pas l'avoir explicitement. Vous pouvez également désactiver la prise en charge du temps d'accès afin qu'il puisse être implémenté de la même manière, puis désactivé si vous ne le vouliez vraiment pas.
slm
18

OSX garde une trace de la création de fichiers, mais la plupart des autres unités ne le font pas, il n'y a donc aucun moyen de connaître le temps écoulé depuis la création du fichier. Vous pouvez obtenir le temps écoulé depuis sa dernière modification sur à peu près n'importe quel système d'exploitation.

Il n'y a pas d'utilitaire de shell portable pour récupérer l'heure de modification d'un fichier, sauf celui lsdont la sortie est presque impossible à analyser. Sous Linux, la commande suivante imprime l'âge d'un fichier:

echo $(($(date +%s) - $(date +%s -r "$filename"))) seconds
echo $((($(date +%s) - $(date +%s -r "$filename")) / 86400)) days

Sous Linux, vous pouvez utiliser stat -c %Y -- "$filename"comme synonyme de date +%s -r "$filename".

Les OSX dateet les statcommandes sont différents. Vous pouvez utiliser la commande suivante:

echo $(($(date +%s) - $(stat -t %s -f %m -- "$filename"))) seconds

Perl est installé par défaut sur les systèmes Linux non intégrés et OSX.

perl -l -e 'print -M $ARGV[0], " days"' "$filename"
Gilles 'SO- arrête d'être méchant'
la source
Cela dépend-il du système d'exploitation ou du système de fichiers? Cette Q&R semble impliquer que le système de fichiers les conserve mais le noyau doit fournir une méthode pour y accéder.
terdon
@terdon - voir mes mises à jour.
slm
@terdon Both. Les questions et réponses que vous liez sont correctes, les systèmes de fichiers actuels suivent le temps de création depuis un certain temps maintenant. Dans FreeBSD, vous pouvez réellement y accéder stat, sous Linux, le syscall n'a pas été retravaillé, vous devez donc recourir au piratage avec debugfs.
wingedsubmariner
1
@wingedsubmariner Avec la mise en garde que l'heure de création dans le système de fichiers n'est souvent pas la date de création dans l'application, car de nombreuses applications utilisent create-new-then-move comme méthode pour enregistrer une nouvelle version plutôt que d'écraser en place.
Gilles 'SO- arrête d'être méchant'
4

Basé sur la réponse de Gilles, voici une fonction bash qui retourne l'âge du fichier en secondes ou erreur.

function fileAge
{
    local fileMod
    if fileMod=$(stat -c %Y -- "$1")
    then
        echo $(( $(date +%s) - $fileMod ))
    else
        return $?
    fi
}
Nicholas Sushkin
la source
1
Fonction soignée, facile à adapter en ajoutant une simple division pour voir l'âge en heure, jours, semaine ....
Emmanuel Devaux
0

Vous pouvez utiliser stat -f%B,, ls -lUou mdls -n kMDItemFSCreationDatepour voir l'heure de création (naissance) dans OS X:

$ stat -f%B file
1402340803
$ ls -lU file
-rw-r--r--  1 admin  staff  108514 Jun  9 22:06 file
$ mdls -n kMDItemFSCreationDate file
kMDItemFSCreationDate = 2014-06-09 19:06:43 +0000
$ echo $((($(date +%s)-$(stat -f%B file))/86400))
10
Lri
la source
0
stat -c %Y <filename>

regarder man statpour les -coptions (format)

Guido Rizzi
la source