269 votes

Comment trouver récursivement le dernier fichier modifié dans un répertoire?

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)?

398voto

plundra Points 4607
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.

141voto

Emerson Farrugia Points 3085

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" "
 

22voto

marco Points 1678

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.

10voto

mgratia Points 41

Cela semble fonctionner correctement, même avec des sous-répertoires:

 find . -type f | xargs ls -ltr | tail -n 1
 

En cas de trop nombreux fichiers, affinez la recherche.

4voto

Karlo Points 248

Cela donne une liste triée:

 find . -type f -ls 2>/dev/null | sort -M -k8,10 | head -n5
 

Inverser l'ordre en plaçant un «-r» dans la commande de tri. Si vous ne voulez que les noms de fichiers, insérez "awk" {print $ 11} '| " avant '| tête'

Prograide.com

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.

Powered by:

X