Il semble que ls
ne trie pas correctement les fichiers lors d’un appel récursif:
ls -altR . | head -n 3
Comment trouver le dernier fichier modifié dans un répertoire (y compris les sous-répertoires)?
Il semble que ls
ne trie pas correctement les fichiers lors d’un appel récursif:
ls -altR . | head -n 3
Comment trouver le dernier fichier modifié dans un répertoire (y compris les sous-répertoires)?
find . -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "
Pour un arbre énorme, il pourrait être difficile pour sort
de tout garder en mémoire.
%T@
vous donne le temps de modification comme un timestamp unix, sort -n
sortes numériquement, tail -1
prend la dernière ligne (la plus haute d'horodatage), cut -f2 -d" "
coupes de loin le premier champ (timestamp) à partir de la sortie.
Edit: Juste comme -printf
est probablement GNU-seulement, ajreals de l'utilisation de stat -c
est trop. Bien qu'il soit possible de faire la même chose sur BSD, les options de mise en forme est différente (-f "%m %N"
il semblerait)
Et j'ai raté la partie de pluriel; si vous en voulez plus alors le dernier fichier, il suffit de remonter la queue argument.
Suite à la réponse de @ plundra , voici la version BSD et OS X:
find . -type f -print0 | xargs -0 stat -f "%m %N" |
sort -rn | head -1 | cut -f2- -d" "
Au lieu de trier les résultats et de ne garder que la dernière modification, vous pouvez utiliser awk pour imprimer seulement l'un avec la plus grande date de modification (dans le temps unix):
find . -type f -printf "%T@\0%p\0" | awk '
{
if ($0>max) {
max=$0;
getline mostrecent
} else
getline
}
END{print mostrecent}' RS='\0'
Cela devrait être un moyen plus rapide pour résoudre votre problème si le nombre de fichiers est assez grand.
J'ai utilisé le caractère NUL (c'est à dire '\0') parce que, en théorie, un nom de fichier peut contenir n'importe quel caractère (y compris l'espace et le retour à la ligne), mais qui.
Si vous n'avez pas pathologique des noms de fichiers dans votre système, vous pouvez utiliser le caractère de saut de ligne:
find . -type f -printf "%T@\n%p\n" | awk '
{
if ($0>max) {
max=$0;
getline mostrecent
} else
getline
}
END{print mostrecent}' RS='\n'
En outre, cela fonctionne en mawk trop.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.