J'ai utilisé la command suivante pour listr les files les plus récemment mis à jour (de manière récursive) dans un directory spécifique et les modifier par heure de modification:
$ stat --printf="%y %n\n" $(ls -tr $(find * -type f))
Cependant, dans la hiérarchie, il y a un directory plein de files qui sont mis à jour presque minute par minute, ce qui rend la command ci-dessus inutile pour find des files en dehors du directory incriminé.
J'ai essayé d'utiliser le drapeau ls -I
mais en vain:
$ stat --printf="%y %n\n" $(ls -trI 'bad-dir' $(find * -type f))
Existe-t-il un moyen simple d'exclure un directory unique / spécifique en utilisant la command ls
? Ou devrais-je pousser la search dans la command find
?
Vous n'avez pas besoin de cela supplémentaire ls -tr
. Ceci est équivalent à votre command et plus rapide:
find . -type f | xargs stat --printf="%y %n\n" | sort -n
Quelque chose comme cela exclut un sous-directory de files:
find . -type f ! -path './directory/to/ignore/*' \ | xargs stat --printf="%y %n\n" \ | sort -n
Cela vérifiera toujours chaque file, si vous voulez ignorer tout un sous-directory utiliser -prune
. Vous devrez réorganiser les choses légèrement afin que nous ne trouvions pas tous les files en premier.
find . -path './directory/to/ignore' -prune -o -type f -print0 \ | xargs -0 stat --printf="%y %n\n" \ | sort -n
Et dans l'intérêt d'être aussi efficace que possible, la stat
était redondante, étant donné que find accède déjà au file. Donc, vous frappez réellement le système de files 2X avec la find ... | stat ...
find ... | stat ...
approche donc voici une méthode plus efficace qui a find
faire tout le travail.
find . -path './directory/to/ignore' -prune -o -printf '%t %p\n' | sort -n
Pour faire fonctionner cette version, j'ai dû adapter les directives printf depuis stat
et find
versions différentes pour les différentes méta-données du système de files.
Avec zsh
:
stat -c '%y %n' -- **/*~path/to/ignore/*(D.Om)