Ho questa struttura di directory:

~/tmp/globstar ɀ find dir -type f dir/file.ext dir/subdir1/file.ext dir/subdir2/file.ext 

e, con il globstar opzione abilitata in Bash, posso dire:

~/tmp/globstar ɀ ls -1 dir/**/*.ext dir/subdir1/file.ext dir/subdir2/file.ext 

La mia domanda è: perché dir/file.ext escluso da questo elenco?

manuale di Bash dice questo su globstar:

Se impostato, il pattern ** utilizzato in un contesto di espansione del nome di file corrisponderà a tutti i file e zero o più directory e sottodirectory. Se il pattern è seguito da un “/”, corrispondono solo le directory e le sottodirectory.

zero ”in questo paragrafo mi lascia con limpressione che dir/file.ext avrebbe dovuto essere incluso; a meno che, si spera, non mi perda qualcosa.

Commenti

  • Cosè questo carattere? ɀ?
  • Quale versione di bash, su quale piattaforma? Non posso ' riprodurlo con bash 4.2.37 su Debian wheezy o bash 4.1.5 su Debian squeeze. @slm unicode ɀ o Wikipedia
  • @Gilles Is that a prompt?
  • slm, sì! ɀ è solo un carattere utilizzato qui per distinguere il prompt. Alcuni utenti preferiscono il carattere £ o invece di $ :). In origine, ɀ un ' z ' carattere creato per una speciale notazione in lingua africana: – )
  • " GNU bash, versione 3.2.53 (1) -release (x86_64-apple-darwin13) " fornito con OS X 10.9 ha questo comportamento.

Answer

Immagino che si riferisca solo al livello di sottodirectory . ** senza / corrisponde a

  1. tutti i file e le directory

  2. zero o più sottodirectory

Ma non scompare completamente. **/ significa che nessun file nella directory di livello più alto a cui si applica ** viene trovato.

È necessario dir/*.ext dir/**/*.ext.

Commenti

  • Sì, questo è esattamente il mio fallback, semplicemente non sembra carino. 😉

Risposta

Funziona come previsto in queste versioni di Bash fornite con le distribuzioni elencate :

  • 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

In effetti le versioni elencate sopra sono tutte quelle che ho testato. In altre parole, non ho trovato una versione 4 di Bash in cui non funziona. Lopzione globstar è stata aggiunta in Bash 4.0 vedi MODIFICHE . Nelle versioni precedenti il comando shopt -s globstar dovrebbe restituire un errore.

Test

1 . dir/**/*.ext corrisponde a dir/file.ext:

~/tests$ ls -1 dir/**/*.ext dir/file.ext dir/subdir1/file.ext dir/subdir2/file.ext 

2. **/*.ext corrisponde a file.ext:

~/tests$ cd dir ~/tests/dir$ ls -1 **/*.ext file.ext subdir1/file.ext subdir2/file.ext 

Preparazione dellambiente per riprodurre i test precedenti:

mkdir -p dir/subdir{1,2} touch dir/{,subdir{1,2}/}file.ext shopt -s globstar 

Commenti

  • questo è il risposta esatta. LOP ha dimenticato di impostare shopt -s globstar.

Risposta

I mi sembra che tu abbia / avessi spento globstar. Può essere attivato in questo modo:

shopt -s globstar 

Non solo non corrisponderà a zero sottodirectory, ma non corrisponderà a due sottodirectory:

$ 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 

Con globstar disattivato, ** finisce per comportarsi esattamente come *, quindi dir/**/*.ext ottiene lo stesso risultato di dir/*/*.ext

$ echo dir/*/*.ext dir/subdir1/file.ext dir/subdir2/file.ext 

che a volte mi induce a pensare che globstar sia attivo

controlla la tua attuale impostazione di globstar come questo:

shopt | grep globstar 

Commenti

  • Puoi controllare limpostazione di unopzione della shell direttamente, come in shopt globstar.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *