J'aimerais écrire quelque chose comme ceci:
$ ls **.py
pour obtenir tous les noms de fichiers .py, parcourant de manière récursive une hiérarchie de répertoires.
Même s'il y a des fichiers .py à trouver, le shell (bash) donne cette sortie:
ls: cannot access **.py: No such file or directory
Un moyen de faire ce que je veux?
EDIT: Je tiens à préciser que le cas spécifique de je ne suis pas intéressé ls
, mais la question concerne la syntaxe glob.
nullglob
nullglob
, je vous conseillerais vivement de lire les avertissements suivants .wc -l {**,.}/*.py
marche très bien** ne fait rien de plus qu'un seul *, les deux fonctionnent dans le répertoire courant
la source
find
si vous n'avez pas bash 4. Exemples:yourcommand `find . -name '*.py'`
(notez les backticks);find . -name '*.py' -exec yourcommand {} \;
.Depuis Bash 4 (y compris zsh), une nouvelle option globbing (
globstar
) a été ajoutée pour traiter le modèle**
différemment lorsqu’il est défini.Il correspond au modèle générique et renvoie les noms de fichier et de répertoire correspondants en remplaçant le modèle générique de la commande par les éléments correspondants.
Normalement, lorsque vous utilisez
**
, cela fonctionne de la même façon*
, mais tous les répertoires sont récursifs de manière récursive (comme une boucle).Pour voir s’il est activé, vérifiez-le par
shopt globstar
(dans les scripts, utilisezshopt -q globstar
).L'exemple
**.py
ne fonctionnerait que pour le répertoire en cours, car il ne renvoie pas de liste de répertoires pouvant être récursifs, c'est pourquoi vous devez utiliser plusieurs caractères génériques au niveau du répertoire**/*.py
pour qu'il puisse aller plus en profondeur.S'il vous plaît trouver sur SO peu de tests de syntaxe que j'ai fait pour trouver tous les fichiers de manière récursive.
la source