Cela fonctionne (mis à jour pour intégrer la suggestion de Daniel Andersson) :
find -type f -printf '%T+ %p\n' | sort | head -n 1
Celui-ci est un peu plus portable et parce qu'il ne repose pas sur le GNU find
poste -printf
, donc ça marche aussi sur BSD / OS X :
find . -type f -print0 | xargs -0 ls -ltr | head -n 1
Le seul inconvénient ici est qu'il est quelque peu limité à la taille de ARG_MAX
(ce qui devrait n'est pas pertinent pour la plupart des nouveaux noyaux). Donc, s'il y a plus de getconf ARG_MAX
caractères retournés (262 144 sur mon système), cela ne vous donne pas le bon résultat. Il n'est pas non plus conforme à POSIX car -print0
et xargs -0
n'est pas.
D'autres solutions à ce problème sont décrites ici :Comment puis-je trouver le dernier fichier (le plus récent, le plus ancien, le plus ancien) dans un répertoire ? – Wiki de Greg
Les commandes suivantes sont garanties pour fonctionner avec tout type de noms de fichiers étranges :
find -type f -printf "%T+ %p\0" | sort -z | grep -zom 1 ".*" | cat
find -type f -printf "%[email protected] %T+ %p\0" | \
sort -nz | grep -zom 1 ".*" | sed 's/[^ ]* //'
stat -c "%y %n" "$(find -type f -printf "%[email protected] %p\0" | \
sort -nz | grep -zom 1 ".*" | sed 's/[^ ]* //')"
Utilisation d'un octet nul (\0
) au lieu d'un saut de ligne (\n
) garantit que la sortie de find sera toujours compréhensible si l'un des noms de fichier contient un caractère de saut de ligne.
Le -z
switch fait que sort et grep interprètent uniquement les octets nuls comme des caractères de fin de ligne. Puisqu'il n'y a pas de commutateur de ce type pour la tête, nous utilisons grep -m 1
à la place (une seule occurrence).
Les commandes sont classées par temps d'exécution (mesuré sur ma machine).
-
La première commande sera la plus lente car elle doit d'abord convertir le mtime de chaque fichier dans un format lisible par l'homme, puis trier ces chaînes. La canalisation vers le chat évite de colorer la sortie.
-
La deuxième commande est légèrement plus rapide. Pendant qu'il effectue toujours la conversion de date, le tri numérique (
sort -n
) les secondes écoulées depuis l'époque Unix sont un peu plus rapides. sed supprime les secondes depuis l'époque Unix. -
La dernière commande n'effectue aucune conversion et devrait être nettement plus rapide que les deux premières. La commande find elle-même n'affichera pas le mtime du fichier le plus ancien, donc stat est nécessaire.
Pages de manuel associées :find – grep – sed – sort – stat