Il semble que ls
ne trie pas correctement les fichiers lors d'un appel récursif:
ls -altR . | head -n 3
Comment puis-je trouver le fichier modifié le plus récemment dans un répertoire (y compris les sous-répertoires)?
bash
filesystems
find
JMW
la source
la source
Réponses:
Pour un arbre énorme, il peut être difficile de
sort
tout garder en mémoire.%T@
vous donne l'heure de modification comme un horodatage Unix,sort -n
trie numériquement,tail -1
prend la dernière ligne (horodatage le plus élevé),cut -f2 -d" "
coupe le premier champ (l'horodatage) de la sortie.Edit: Tout comme
-printf
probablement uniquement GNU, l'utilisation correcte de l'stat -c
est également. Bien qu'il soit possible de faire de même sur BSD, les options de formatage sont différentes (-f "%m %N"
il semblerait)Et j'ai raté la partie du pluriel; si vous voulez plus que le dernier fichier, augmentez simplement l'argument tail.
la source
sort -rn | head -3
au lieu desort -n | tail -3
. Une version donne les fichiers du plus ancien au plus récent, tandis que l'autre va du plus récent au plus ancien.sort
va créer des fichiers temporaires (in/tmp
) au besoin, donc je ne pense pas que ce soit un problème.-printf '%T@ %Tb %Td %TY %p\n'
vous donnera un horodatage (si nécessaire) (similaire àls
)find . -type f -printf '%TF %TT %p\n' | sort | tail -1
Suite à la réponse de @ plundra , voici la version BSD et OS X:
la source
find
charge+
au lieu de\;
? Parce que cela fait la même chose (passer plusieurs fichiers en tant que paramètres), sans le-print0 | xargs -0
tube.head -1
àhead -5
Au lieu de trier les résultats et de ne conserver que les derniers modifiés, vous pouvez utiliser awk pour imprimer uniquement celui avec le plus grand temps de modification (en temps unix):
Cela devrait être un moyen plus rapide de résoudre votre problème si le nombre de fichiers est suffisamment important.
J'ai utilisé le caractère NUL (c'est-à-dire '\ 0') parce que, théoriquement, un nom de fichier peut contenir n'importe quel caractère (y compris l'espace et la nouvelle ligne) mais cela.
Si vous n'avez pas de tels noms de fichiers pathologiques dans votre système, vous pouvez également utiliser le caractère de nouvelle ligne:
De plus, cela fonctionne aussi dans mawk.
la source
mawk
l'alternative standard Debian.J'ai eu du mal à trouver le dernier fichier modifié sous Solaris 10. Il
find
n'y a pas d'printf
option etstat
n'est pas disponible. J'ai découvert la solution suivante qui fonctionne bien pour moi:Pour afficher également le nom de fichier
Explication
find . -type f
recherche et répertorie tous les fichierssed 's/.*/"&"/'
encapsule le chemin entre guillemets pour gérer les espaces blancsxargs ls -E
envoie le chemin entre guillemets àls
, l'-E
option s'assure qu'un horodatage complet (format année-mois-jour heure-minute-secondes-nanosecondes ) est retournéawk '{ print $6," ",$7 }'
extrait uniquement la date et l'heureawk '{ print $6," ",$7," ",$9 }'
extrait la date, l'heure et le nom du fichiersort
renvoie les fichiers triés par datetail -1
renvoie uniquement le dernier fichier modifiéla source
Cela semble fonctionner correctement, même avec des sous-répertoires:
En cas de trop de fichiers, affinez la recherche.
la source
-l
optionls
semble inutile.-tr
Semble juste suffisant.find . -type f -print0 | xargs -0 ls -ltr | tail -n 1
Affiche le dernier fichier avec un horodatage lisible par l'homme:
Le résultat ressemble à ceci:
Pour afficher plus de fichiers, remplacez-les
-n1
par un nombre plus élevéla source
J'utilise quelque chose de similaire tout le temps, ainsi que la liste top-k des fichiers les plus récemment modifiés. Pour les grandes arborescences de répertoires, il peut être beaucoup plus rapide d'éviter le tri . Dans le cas du premier fichier modifié en dernier lieu:
Sur un répertoire contenant 1,7 million de fichiers, j'obtiens le plus récent en 3,4s, une accélération de 7,5x contre la solution de 25,5s en utilisant sort.
la source
lastfile
) et vous pouvez ensuite faire ce que vous voulez avec le résultat, commels -l $(lastfile .)
, ouopen $(lastfile .)
(sur un Mac), etc.Cela donne une liste triée:
Inversez l'ordre en plaçant un «-r» dans la commande de tri. Si vous ne voulez que des noms de fichiers, insérez "awk '{print $ 11}' |" avant '| tête'
la source
Sur Ubuntu 13, ce qui suit le fait, peut-être un peu plus vite, car il inverse le tri et utilise 'head' au lieu de 'tail', ce qui réduit le travail. Pour afficher les 11 fichiers les plus récents dans une arborescence:
trouver . -type f -printf '% T @% p \ n' | sort -n -r | tête -11 | cut -f2- -d "" | sed -e, ^. / ,, '| xargs ls -U -l
Cela donne une liste complète de ls sans re-tri et omet l'ennuyeux './' que 'find' met sur chaque nom de fichier.
Ou, en tant que fonction bash:
Pourtant, la plupart du travail a été fait par la solution originale de plundra. Merci plundra.
la source
J'ai fait face au même problème. J'ai besoin de trouver le fichier le plus récent de manière récursive. trouver a pris environ 50 minutes pour trouver.
Voici un petit script pour le faire plus rapidement:
Il s'agit d'une fonction récursive qui obtient l'élément modifié le plus récent d'un répertoire. Si cet élément est un répertoire, la fonction est appelée récursivement et recherche dans ce répertoire, etc.
la source
Je trouve ce qui suit plus court et avec une sortie plus interprétable:
Compte tenu de la longueur fixe des heures de format standard ISO, le tri lexicographique est très bien et nous n'avons pas besoin de l'
-n
option sur le tri.Si vous souhaitez supprimer à nouveau les horodatages, vous pouvez utiliser:
la source
Si l'exécution
stat
sur chaque fichier individuellement est trop lente, vous pouvez utiliserxargs
pour accélérer un peu les choses:la source
Cela modifie récursivement l'heure de modification de tous les répertoires du répertoire actuel par le fichier le plus récent de chaque répertoire:
la source
Ce simple cli fonctionnera également:
Vous pouvez changer le -1 au nombre de fichiers que vous souhaitez lister
la source
J'ai trouvé la commande ci-dessus utile, mais pour mon cas, j'avais besoin de voir la date et l'heure du fichier et j'ai eu un problème avec plusieurs fichiers qui ont des espaces dans les noms. Voici ma solution de travail.
la source
La commande suivante a fonctionné sur Solaris:
la source
Ignorer les fichiers cachés - avec un horodatage agréable et rapide
Résultat
Gère bien les espaces dans les noms de fichiers - pas que ceux-ci doivent être utilisés!
Plus
Plus à
find
gogo en suivant le lien.la source
Pour rechercher des fichiers dans / target_directory et tous ses sous-répertoires, qui ont été modifiés au cours des 60 dernières minutes:
Pour rechercher les fichiers les plus récemment modifiés, triés dans l'ordre inverse de l'heure de mise à jour (c'est-à-dire les fichiers les plus récemment mis à jour en premier):
la source
Je préfère celui-ci, il est plus court:
la source
J'ai écrit un package pypi / github pour cette question car j'avais également besoin d'une solution.
https://github.com/bucknerns/logtail
Installer:
Utilisation: queues fichiers modifiés
Usage2: Ouvre le dernier fichier modifié dans l'éditeur
la source