dernier fichier ouvert

95

Est-il possible d'obtenir l'heure à laquelle le fichier a été ouvert la dernière fois et de trier tous les fichiers d'un répertoire par ces heures?

étudiant
la source

Réponses:

173

Cela dépend de ce que vous entendez par "ouvert", mais en général, oui. Il y a trois horodatages normalement enregistrés:

  • mtime- mis à jour lorsque le contenu du fichier change. C'est l'heure du fichier "par défaut" dans la plupart des cas.
  • ctime- mis à jour lorsque le fichier ou ses métadonnées (propriétaire, autorisations) changent
  • atime - mis à jour lors de la lecture du fichier

Donc, en général, ce que vous voulez voir est le atimefichier. Vous pouvez l'obtenir avec statou avec ls. Vous pouvez utiliser ls -luceci, bien que je préfère utiliser ls -l --time=atime(ce qui devrait être supporté dans presque toutes les distributions Linux modernes) parce que je ne l'utilise pas souvent, et quand je le fais, je m'en souviens mieux. Et pour trier par heure, ajoutez le -tdrapeau à ls. Alors voilà.

Il y a cependant une grosse mise en garde. La mise à jour de l'heure à chaque lecture d'un fichier entraîne beaucoup d'E / S généralement inutiles, ce qui ralentit tout. Ainsi, la plupart des distributions Linux noatimeutilisent maintenant l’ option de montage du système de fichiers, qui tue pratiquement toutes les fois, ou relatimene met à jour que très souvent une fois la limite écoulée (normalement une fois par jour) ou si le fichier a été modifié depuis la dernière lecture. Vous pouvez trouver si ces options sont actives en exécutant la mountcommande.

Notez également que les temps d'accès sont par inode, et non par nom de fichier. Ainsi, si vous avez des liens physiques, la lecture de l'un d'eux mettra à jour tous les noms qui font référence au même fichier.

Et, sachez que c n’est pas une "création"; la création n'est pas suivie par les systèmes de fichiers Unix / Linux, ce qui semble étrange mais qui a du sens car le système de fichiers n'a aucun moyen de savoir s'il s'agit de l'original - le fichier a peut-être été créé il y a quarante ans et copié ici. Et, en fait, de nombreux éditeurs de fichiers travaillent en faisant des copies sur l’original. Si vous avez besoin de ces informations, il est préférable d’utiliser un système de contrôle de version tel que git.

mattdm
la source
9
Je vous en donnerais plus de +1 si je pouvais, simplement pour ne pas avoir appelé ctime "Creation Time".
Jsbillings
2
Selon la page de manuel mount, relatime n’a rien à voir avec les limites journalières, il ne regarde que l’atime par rapport à mtime et à ctime. Si atime est plus ancien que mtime ou ctime, il est mis à jour. Si atime est plus récent que les deux, il est laissé tel quel. Le but est de préserver la relation entre atime et mtime / ctime, car certaines applications utilisent ces informations, comme mutt pour voir si votre boîte aux lettres a été lue depuis sa dernière mise à jour.
jw013
1
@ jw013 C'est le cas depuis le noyau 2.6.30. Il est vrai que certaines distributions plus anciennes peuvent ne pas avoir ce comportement. (Mais pour des distributions comme Fedora, c'était vrai même lorsque j'ai écrit la version originale de cette réponse il y a trois ans.) Recherchez une mountpage de manuel mise à jour .
Mattdm
1
lsraccourcit le temps par défaut à une précision raisonnable. Pour voir l'heure en toute précision, on peut utiliser --full-time.
jlh
19

ls -ltu liste tous les fichiers, montrant et triant par temps d'accès.

De man ls:

-u     with -lt: sort by, and show, access time with -l: show access
       time and sort by name otherwise: sort by access time
Shawn J. Goff
la source
4

La findcommande est la meilleure pour cela. Voir les -ctime, -mtimeet les -atimeoptions

GBH
la source
3

Si votre liste est destinée à la consommation humaine, utilisez-la lsavec l'un des indicateurs de tri par date ( -tupour l'heure d'accès (lecture), uniquement -tpour l' heure de modification (écriture) ou -tcpour l'heure de changement d'inode). Voir la réponse de mattdm pour plus d'informations (en particulier la mise en garde concernant -aet la définition de -c).

S'il s'agit d'une consommation de programme, l' analyse de la sortie de lsest problématique . De toute façon, si votre shell est en zsh, vous n’avez de lstoute façon plus besoin de rien : zsh dispose de qualificatifs globbing pour trier les correspondances en augmentant le temps access ( *(Oa)), inode change ( *(Oc)) ou modification ( *(Om)). Un tri minuscule oen vieillissant.

act_on_files_by_date *(Om)

Sinon, si vous savez que les noms de fichier ne contiennent pas de caractères de nouvelle ligne ou non imprimables (dans les paramètres régionaux en cours), vous pouvez effectuer les opérations suivantes:

ls -t | while read -r name; do act_on_one_file "$name"; done
ls -t | xargs -I {} act_on_one_file {}

Si vous souhaitez appeler une commande sur plusieurs fichiers à la fois, vous avez besoin de plus de configuration. Notez que act_on_files_by_date $(ls -t)cela ne fonctionne pas comme cela, car les noms de fichiers contenant des caractères génériques ou des espaces seraient développés dans le résultat de la substitution de commande. Le code suivant fonctionne tant qu'aucun nom de fichier ne contient de nouvelle ligne ou de caractère non imprimable:

IFS='
'
set -f
act_on_files_by_date $(ls -t)
set +f
unset IFS

Si vous voulez faire face à des noms de fichiers arbitraires, vous aurez beaucoup de mal à faire appel à des outils plus puissants qu'un shell standard: zsh, perl, python…

Gilles
la source