Jai cette structure de répertoire:
~/tmp/globstar ɀ find dir -type f dir/file.ext dir/subdir1/file.ext dir/subdir2/file.ext
et, avec le globstar
option activée dans Bash, je peux dire:
~/tmp/globstar ɀ ls -1 dir/**/*.ext dir/subdir1/file.ext dir/subdir2/file.ext
Ma question est: pourquoi dir/file.ext
exclu de cette liste?
Le manuel Bash dit ceci à propos de globstar
:
Si défini, le modèle ** utilisé dans un contexte dexpansion de nom de fichier correspondra à tous les fichiers et à zéro ou plusieurs répertoires et sous-répertoires. Si le modèle est suivi dun /, seuls les répertoires et sous-répertoires correspondent.
« zéro « dans ce paragraphe me laisse limpression que dir/file.ext
aurait dû être inclus; sauf si, espérons-le, quelque chose me manque.
Commentaires
Réponse
Je suppose que cela se réfère uniquement au niveau du sous-répertoire . **
sans /
correspond à
-
tous les fichiers et répertoires
-
zéro ou plusieurs sous-répertoires
Mais cela ne disparaît pas complètement. **/
signifie quaucun fichier du répertoire de plus haut niveau auquel **
sapplique ne correspond.
Vous devez dir/*.ext dir/**/*.ext
.
Commentaires
- Ouais, cest exactement ma solution de rechange, ça na pas lair joli. 😉
Réponse
Cela fonctionne comme prévu dans ces versions de Bash fournies avec les distributions répertoriées :
- 4.1.2 (1) – CentOS 6.5
- 4.1.5 (1) – Debian 6.0.10
- 4.1.10 (4 ) – Cygwin 1.7.31
- 4.2.46 (1) – CentOS 7.1
- 4.3.11 (1) – Ubuntu 14.04.1
- 4.3.30 (1) – Debian 8.1
En fait, les versions listées ci-dessus sont tout ce que jai testé. En dautres termes, je nai pas trouvé de version 4 de Bash où cela ne fonctionne pas. Loption globstar
a été ajoutée dans Bash 4.0 voir CHANGEMENTS . Dans les anciennes versions, la commande shopt -s globstar
devrait renvoyer une erreur.
Tests
1 . dir/**/*.ext
correspond à dir/file.ext
:
~/tests$ ls -1 dir/**/*.ext dir/file.ext dir/subdir1/file.ext dir/subdir2/file.ext
2. **/*.ext
correspond à file.ext
:
~/tests$ cd dir ~/tests/dir$ ls -1 **/*.ext file.ext subdir1/file.ext subdir2/file.ext
Préparation de lenvironnement pour reproduire les tests ci-dessus:
mkdir -p dir/subdir{1,2} touch dir/{,subdir{1,2}/}file.ext shopt -s globstar
Commentaires
- cest le bonne réponse. LOP a oublié de définir
shopt -s globstar
.
Réponse
I il me semble que vous avez / avait éteint globstar. Il peut être activé comme ceci:
shopt -s globstar
Non seulement il ne correspondra pas à zéro sous-répertoire, mais il ne correspondra pas non plus à deux sous-répertoires:
$ find dir -type f #the same as yours except with a directory inside one of the subdirectories dir/file.ext dir/subdir1/file.ext dir/subdir1/subsubdir/file.ext dir/subdir2/file.ext $ shopt -u globstar #turn globstar off $ #will only show files in subdirectories $ #will not show files in dir or in subsubdir $ echo dir/**/*.ext dir/subdir1/file.ext dir/subdir2/file.ext $ shopt -s globstar #turn globstar on $ #will show all four files $ echo dir/**/*.ext dir/file.ext dir/subdir1/file.ext dir/subdir1/subsubdir/file.ext dir/subdir2/file.ext
Avec globstar désactivé, ** finit par se comporter comme *, donc dir/**/*.ext
obtient le même résultat que dir/*/*.ext
$ echo dir/*/*.ext dir/subdir1/file.ext dir/subdir2/file.ext
ce qui me pousse parfois à penser que globstar est activé
vérifiez votre paramètre de globstar actuel comme ceci:
shopt | grep globstar
Commentaires
- Vous pouvez vérifier un paramètre doption de shell directement, comme dans
shopt globstar
.
ɀ
?unicode ɀ
ou Wikipédiaɀ
est juste un caractère utilisé ici pour distinguer linvite. Certains utilisateurs préfèrent le caractère£
ou€
au lieu de$
:). À lorigine, le caractèreɀ
a ' z ' créé pour une notation spéciale de la langue africaine: – )