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
Answer
Immagino che si riferisca solo al livello di sottodirectory . **
senza /
corrisponde a
-
tutti i file e le directory
-
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
.
ɀ
?unicode ɀ
o Wikipediaɀ
è 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: – )