En excluant un directory spécifique en utilisant un récursif 'ls'

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.

Les references

  • find la page man
  • Page de manuel de xargs
  • sortinger la page man

Avec zsh :

 stat -c '%y %n' -- **/*~path/to/ignore/*(D.Om)