La combinaison de find
et ls
fonctionne bien pour
- noms de fichiers sans nouvelles lignes
- pas très grand nombre de fichiers
- noms de fichiers pas très longs
La solution:
find . -name "my-pattern" -print0 |
xargs -r -0 ls -1 -t |
head -1
Décomposons-le:
Avec find
nous pouvons faire correspondre tous les fichiers intéressants comme celui-ci:
find . -name "my-pattern" ...
puis en utilisant, -print0
nous pouvons passer tous les noms de fichiers en toute sécurité ls
comme ceci:
find . -name "my-pattern" -print0 | xargs -r -0 ls -1 -t
des find
paramètres et des modèles de recherche supplémentaires peuvent être ajoutés ici
find . -name "my-pattern" ... -print0 | xargs -r -0 ls -1 -t
ls -t
triera les fichiers par heure de modification (le plus récent en premier) et l'imprimera un par ligne. Vous pouvez utiliser -c
pour trier par heure de création. Remarque : cela rompra avec les noms de fichiers contenant des nouvelles lignes.
Enfin head -1
nous obtient le premier fichier dans la liste triée.
Remarque: xargs
utilisez les limites du système à la taille de la liste d'arguments. Si cette taille dépasse, xargs
appellera ls
plusieurs fois. Cela interrompra le tri et probablement aussi la sortie finale. Courir
xargs --show-limits
pour vérifier les limites de votre système.
Remarque 2: à utiliser find . -maxdepth 1 -name "my-pattern" -print0
si vous ne souhaitez pas rechercher de fichiers dans les sous-dossiers.
Note 3: Comme indiqué par @starfry - l' -r
argument pour xargs
empêche l'appel de ls -1 -t
, si aucun fichier ne correspond au find
. Merci pour la suggestion.