Jag har den här katalogstrukturen:
~/tmp/globstar ɀ find dir -type f dir/file.ext dir/subdir1/file.ext dir/subdir2/file.ext
och, med globstar
alternativet aktiverat i Bash, jag kan säga:
~/tmp/globstar ɀ ls -1 dir/**/*.ext dir/subdir1/file.ext dir/subdir2/file.ext
Min fråga är: varför är dir/file.ext
utesluten från den här listan?
Bash manual säger detta om globstar
:
Om inställt kommer mönstret ** som används i ett filnamnsexpansionskontext att matcha alla filer och noll eller fler kataloger och underkataloger. Om mönstret följs av ett /, matchar endast kataloger och underkataloger.
“ noll ”i detta stycke låt mig få intrycket att dir/file.ext
borde ha inkluderats; såvida jag inte förhoppningsvis saknar något.
Kommentarer
Svar
Jag antar att det bara refererar till underkatalognivån . **
utan /
matchar
-
alla filer och kataloger
-
noll eller fler underkataloger
Men det försvinner inte helt. **/
betyder att inga filer i katalogen på högsta nivå som **
gäller matchas.
Du behöver dir/*.ext dir/**/*.ext
.
Kommentarer
- Ja, det är precis min reserv, det ser bara inte söt ut. 😉
Svar
Detta fungerar som du förväntat dig i dessa versioner av Bash som levereras med de listade distributionerna :
- 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
De versioner som anges ovan är faktiskt allt jag testat. Med andra ord hittade jag inte en version 4 av Bash där den inte fungerar. Alternativet globstar
lades till i Bash 4.0 se FÖRÄNDRINGAR . I äldre versioner ska kommandot shopt -s globstar
returnera ett fel.
Tester
1 . dir/**/*.ext
matchar dir/file.ext
:
~/tests$ ls -1 dir/**/*.ext dir/file.ext dir/subdir1/file.ext dir/subdir2/file.ext
2. **/*.ext
matchar file.ext
:
~/tests$ cd dir ~/tests/dir$ ls -1 **/*.ext file.ext subdir1/file.ext subdir2/file.ext
Förbereder miljön för att reproducera testerna ovan:
mkdir -p dir/subdir{1,2} touch dir/{,subdir{1,2}/}file.ext shopt -s globstar
Kommentarer
- detta är rätt svar. OP glömde att ställa in
shopt -s globstar
.
Svar
I ser ut för mig som om du har / har stängt av globstar. Det kan sättas på så här:
shopt -s globstar
Det kommer inte bara att matcha noll underkataloger, utan det matchar inte två underkataloger heller:
$ 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
Med globstar av, slutar ** bete sig precis som *, så dir/**/*.ext
får samma resultat som dir/*/*.ext
$ echo dir/*/*.ext dir/subdir1/file.ext dir/subdir2/file.ext
vilket ibland lurar mig att tro att globstar är på
kolla din nuvarande globstar-inställning som detta:
shopt | grep globstar
Kommentarer
- Du kan kontrollera inställningen för skalalternativ direkt, som i
shopt globstar
.
ɀ
?unicode ɀ
eller Wikipediaɀ
är bara ett tecken som används här för att urskilja prompten. Vissa användare föredrar tecknet£
eller€
istället för$
:). Ursprungligen skapadesɀ
a ' z ' för en speciell afrikansk språknotation: – )