web-dev-qa-db-fra.com

Comment puis-je rechercher un nom générique dans tous les sous-dossiers?

Comment puis-je rechercher un nom générique dans tous les sous-dossiers? Quel serait l'équivalent de la commande DOS: dir *pattern* /s dans * nix?

29
Eduard Florinescu

Vous pouvez utiliser find. Si, par exemple, vous vouliez trouver tous les fichiers et répertoires qui avaient abcd dans le nom de fichier, vous pouvez exécuter:

find . -name '*abcd*'
43
Ryan A.

Zsh:

ls -ld -- **/*abcd*

Ksh93:

set -o globstar     # put this line in your ~/.kshrc
ls -ld -- **/*abcd*

Bash ≥4:

shopt -s globstar   # put this line in your ~/.bashrc
ls -ld -- **/*abcd*

Yash:

set -o extendedglob # put this line in your ~/.yashrc
ls -ld -- **/*abcd*

tcsh:

set globstar
ls -ld -- **/*abcd*

poisson:

ls -ld -- **abcd*

(attention certains de ces shells suivront des liens symboliques lors de la descente de l'arborescence de répertoires; certains de ceux qui n'aiment pas zsh, yash ou tcsh ont ***/*abcd* pour le faire).

Portable (sauf pour les systèmes très anciens; OpenBSD a pris du temps mais prend finalement en charge exec … + depuis le 5.1):

find . -name '*abcd*' -exec ls -ld {} +

Pas POSIX mais fonctionne sur * BSD, Linux, Cygwin, BusyBox:

find . -name '*abcd*' -print0 | xargs -0 ls -ld

Notez que sauf dans certains BSD, si aucun fichier correspondant n'est trouvé, ls -ld sera exécuté sans arguments, donc listera .. Avec certaines implémentations xargs, vous pouvez utiliser le -r option pour contourner cela.

Non mentionné dans les autres réponses est

ls -R1 | grep pattern

ls arguments utilisés:

-R, --recursive
       list subdirectories recursively
-1     list one file per line
0
Eduard Florinescu