Comment lister les fichiers récursivement et les trier par heure de modification?


13

Comment répertorier tous les fichiers d'un répertoire de manière récursive et trier la sortie par heure de modification?

J'utilise normalement ls -lhtcmais il ne trouve pas tous les fichiers récursivement. J'utilise Linux et Mac.

ls -l sur Mac OS X peut donner

-rw-r--r--    1 fsr  user      1928 Mar  1  2011 foo.c
-rwx------    1 fsr  user      3509 Feb 25 14:34 bar.c

où la partie date n'est pas cohérente ou alignée, donc une solution doit en tenir compte.

Solution partielle

stat -f "%m%t%Sm %N" ./* | sort -rn | head -3 | cut -f2-

fonctionne, mais pas récursivement.


Je vais supposer que vous êtes sous Linux, mais vous devez spécifier explicitement votre système d'exploitation dans la question ou de préférence dans une balise.
EBGreen

Réponses:


2

Voici une méthode utilisant statas @ johnshen64 suggérée

find . -type f -exec stat -f "%m%t%Sm %N" '{}' \; | sort -rn | head -20 | cut -f2-

find "$PWD" -type f -exec stat -f $'%m\t%N' '{}' \; | sort -rn | cut -f2-imprimerait uniquement les chemins absolus des fichiers sur OS X.
Lri

quelle version statutilisez-vous? votre format ci-dessus ne fonctionnait pas pour moi. Je devais utiliser ce qui suit: find . -type f -exec stat --printf "%Y\t%y %N\n" '{}' \; | sort -rn | cut -f2-. C'est avecstat (GNU coreutils) 8.23
user84207

12

Utilisez findl » -printfet trier sur un format de date raisonnable:

find -type f -printf '%T+\t%p\n' | sort -n

Cela devrait minimiser les fourches de processus et donc être le plus rapide.

Exemples si vous n'aimez pas la seconde partie fractionnaire (qui n'est souvent pas implémentée dans le système de fichiers de toute façon):

find -type f -printf '%T+\t%p\n' | sed 's/\.[[:digit:]]\{10\}//' | sort -n
find -type f -printf '%T+\t%p\n' | cut --complement -c 20-30 | sort -n

EDIT: Standard findsur Mac n'a pas -printf. Mais il n'est pas difficile d' installer GNU find sur Mac (voir également ce lien pour plus de mises en garde concernant la compatibilité Mac / Linux et xargs).


0

find .devrait être en mesure d'obtenir tous les fichiers. Quelque chose comme ça:

find . -exec ls -dl '{}' \; | sort -k 6,7

Vous devez l'adapter à vos besoins.


Je suppose également que c'est Linux, comme EBGreen l'a dit, ls est un alias dans Windows PS, vous devez donc utiliser sort-object et obtenir les éléments enfants de manière récursive si c'est le cas, mais l'idée est la même.
johnshen64

Cela fonctionne-t-il vraiment correctement lorsque les dates manquent parfois la partie année, sur Mac?
qazwsx

vous avez raison, l'affichage de la date pour les fichiers récents gâchera les choses. vous devez utiliser stat à la place pour obtenir la date au format exact dans ce cas. mes fichiers sont tous très anciens, donc la commande a bien fonctionné, c'est pourquoi j'ai ajouté la clause tune :-)
johnshen64

@ johnshen64: lssous Linux, --time-formatvous pouvez utiliser une option pour vous assurer que les dates de fichier récentes et anciennes sont affichées dans le même format.
RedGrittyBrick

ah merci, vous avez raison, je n'ai pas utilisé ça. c'est beaucoup plus simple que d'utiliser stat. cela s'appelle - style de temps je pense.
johnshen64

0

Cette réponse à une question similaire sur le site Unix Stack Exchange m'a aidé car j'utilisais zsh:

Comment lister les fichiers triés par date de modification de manière récursive (pas de commande stat disponible!)


C'est vraiment un commentaire et non une réponse à la question d'origine. Vous pouvez toujours commenter vos propres articles, et une fois que vous aurez une réputation suffisante, vous pourrez commenter n'importe quel article . Veuillez lire Pourquoi ai-je besoin de 50 points de réputation pour commenter? Que puis-je faire à la place?
DavidPostill
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.