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

  • Quel est ce personnage? ɀ?
  • Quelle version de bash, sur quelle plateforme? Je peux ' reproduire ceci avec bash 4.2.37 sur Debian Wheezy ou bash 4.1.5 sur Debian squeeze. @slm unicode ɀ ou Wikipédia
  • @Gilles Est-ce une invite?
  • slm, oui! ɀ 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: – )
  • " GNU bash, version 3.2.53 (1) -release (x86_64-apple-darwin13) " livré avec OS X 10.9 a ce comportement.

Réponse

Je suppose que cela se réfère uniquement au niveau du sous-répertoire . ** sans / correspond à

  1. tous les fichiers et répertoires

  2. 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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *