Comment récursive de trouver la dernière modification du fichier dans un répertoire?
Il semble que ls
ne pas trier les fichiers correctement lorsque l'on fait un appel récursif:
ls -altR . | head -n 3
Comment puis-je trouver le plus récemment modifié le fichier dans un répertoire (y compris les sous-répertoires)?
Vous devez vous connecter pour publier un commentaire.
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 (le timestamp) à partir de la sortie.Edit: comme
-printf
est probablement GNU-seulement, ajreals utilisation destat -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 voulez plus de la dernier fichier, il suffit de remonter la queue argument.
stat -c
est beaucoup trop lentsort -rn | head -3
au lieu desort -n | tail -3
. Une version offre les fichiers de la plus ancienne à la plus récente, tandis que l'autre va de la plus récente à la plus ancienne.sort
permettra de créer des fichiers temporaires (en/tmp
) comme nécessaire, donc je ne pense pas que c'est un sujet de préoccupation.-printf '%T@ %Tb %Td %TY %p\n'
vous donner une date cachet (si nécessaire) (similaire àls
)find . -type f -printf '%TF %TT %p\n' | sort | tail -1
-mtime -7
pourrait être ajouté àfind
grandement accélérer le processus.Suivi @plundra réponse, voici la BSD et mac OS X version:
find ... -print0 | xargs -0 stat ...
plutôt quefind -exec stat ... {} \;
— ci lance unstat
processus pour chaque fichier, mais le premier utilise unstat
processus pour de nombreux fichiers. Aussi,sort -n | tail -1
des pertes de temps danstail
rejet de sortie: vaut-il mieux écriresort -rn | head -1
de sorte qu'une seule ligne de sortie desort
doit être traité. J'ai mis à jour la réponse en conséquence.find
soutien+
au lieu de\;
? Parce que cela fait la même chose (en passant de plusieurs fichiers en tant que paramètres), sans le-print0 | xargs -0
pipe.head -1
àhead -5
Au lieu de trier les résultats et de ne garder que la dernière modifiées, vous pouvez utiliser awk pour imprimer seulement l'un avec la plus grande date de modification (dans le temps unix):
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 ainsi:
En outre, cela fonctionne en mawk trop.
mawk
, la Debian standard alternative.J'ai eu de la peine à trouver le dernier fichier modifié sous Solaris 10. Il y
find
n'a pas leprintf
option etstat
n'est pas disponible. J'ai découvert la solution suivante qui fonctionne bien pour moi:Pour afficher le nom de fichier ainsi utiliser
Explication
find . -type f
trouve et répertorie tous les fichierssed 's/.*/"&"/'
enveloppe le chemin d'accès entre guillemets pour gérer les espacementsxargs ls -E
envoie la cité chemin dels
, le-E
option permet de s'assurer que plein d'horodatage (format année-mois-jour-heure-minute-seconde-nanosecondes) est retournéawk '{ print $6," ",$7 }'
extraits seulement la date et l'heureawk '{ print $6," ",$7," ",$9 }'
extraits de la date, l'heure et le nom de fichiersort
renvoie les fichiers triés par datetail -1
retourne uniquement le dernier fichier modifiéCela semble bien fonctionner, même avec des sous-répertoires:
En cas de trop grand nombre de fichiers, d'affiner les trouver.
-l
option pourls
semble inutile. Juste-tr
semble suffisant.find . -type f -print0 | xargs -0 ls -ltr | tail -n 1
Montre la dernière fichier lisible par l'homme timestamp:
Résultat ressemble à ceci:
Pour afficher plusieurs fichiers, remplacer
-n1
avec un nombre plus élevéCela donne une liste triée:
Inverser l'ordre en plaçant un "- r " dans la commande de tri. Si vous ne souhaitez que des noms de fichiers, insérer "awk '{print $11}' |" avant "| head",
Sur Ubuntu 13, t-il, peut-être un peu plus vite, car il inverse le tri et utilise le "chef" au lieu de "queue", ce qui réduit le travail. Pour afficher le 11 nouveau les fichiers dans une arborescence:
trouver . -type f -printf '%T@ %p\n' | sort -n -r | tête -11 | cut-f2-d" " | sed -e 's,^./,,' | xargs-ls -U -l
Cela donne une complète ls inscription sans re-trier et omet l'ennuyeux './' que "trouver" met sur chaque nom de fichier.
Ou, comme bash fonction:
Encore, la plupart du travail a été fait par plundra de la solution d'origine. Grâce plundra.
J'ai fait face à la même question. J'ai besoin de trouver la plus récente du fichier de manière récursive. trouver près de 50 minutes pour trouver.
Voici un petit script pour faire plus vite:
C'est une fonction récursive qui obtenir la plus récente modification d'un répertoire. Si cet élément est un répertoire, la fonction est appelée récursivement et de recherche dans ce répertoire, etc.
- Je utiliser quelque chose de similaire, tout le temps, ainsi que le top-k liste des derniers fichiers modifiés. Pour les grandes arborescences de répertoires, il peut être beaucoup plus vite pour éviter le tri. Dans le cas de la juste top-1 modification la plus récente du fichier:
Sur un répertoire contenant 1,7 million de fichiers, j'obtiens le plus récent en 3.4 s, une vitesse de 7,5 x contre la 25.5 s solution à l'aide de tri.
Si l'exécution de
stat
sur chaque fichier individuellement est trop lente, vous pouvez utiliserxargs
pour accélérer un peu les choses:Ce de manière récursive modifications de l'heure de modification de tous les répertoires dans le répertoire courant les fichiers les plus récents dans chaque répertoire:
Cette simple cli travaillera également:
Vous pouvez changer le -1 pour le nombre de fichiers que vous souhaitez ajouter à la liste
J'ai trouvé la commande ci-dessus utiles, mais pour mon cas j'avais besoin de voir la date et l'heure du fichier ainsi j'ai eu un problème avec plusieurs fichiers qui ont des espaces dans les noms.
Voici ma solution de travail.
La commande suivante travaillé sur Solaris :
- Je trouver la suite plus court et avec plus interprétables de sortie:
Compte tenu de la longueur fixe de la standardisation du format ISO datetimes, tri lexicographique est très bien et nous n'avons pas besoin de la
-n
option sur le tri.Si vous souhaitez supprimer les horodateurs de nouveau, vous pouvez utiliser:
En ignorant les fichiers cachés — avec nice & rapide horodatage
Résultat
Gère les espaces dans les noms de fichiers — pas qu'ils devraient être utilisés!
Plus
Plus
find
à gogo en suivant le lien.Je préfère celui-ci, il est plus court:
J'ai écrit un pypi/github paquet pour cette question parce que j'ai besoin d'une solution en tant que bien.
https://github.com/bucknerns/logtail
Installer:
Utilisation: queues de fichiers modifiés
Usage2: ouvrir le dernier fichier modifié dans l'éditeur
De rechercher des fichiers dans /target_directory et tous ses sous-répertoires, qui ont été modifiés dans les 60 dernières minutes:
De trouver le plus récemment modifié les fichiers, triés dans l'ordre inverse du temps de mise à jour (c'est à dire, les plus récemment mis à jour les fichiers de première):