Jeg har denne mappestruktur:
~/tmp/globstar ɀ find dir -type f dir/file.ext dir/subdir1/file.ext dir/subdir2/file.ext
og med globstar
mulighed aktiveret i Bash, jeg kan sige:
~/tmp/globstar ɀ ls -1 dir/**/*.ext dir/subdir1/file.ext dir/subdir2/file.ext
Mit spørgsmål er: hvorfor er dir/file.ext
ekskluderet fra denne liste?
Bash manual siger dette om globstar
:
Hvis det er angivet, vil mønsteret **, der bruges i en filudvidelseskontekst, matche alle filer og nul eller flere mapper og underkataloger. Hvis mønsteret følges af et /, er det kun mapper og underkataloger, der matcher.
“ nul ”i dette afsnit giver mig det indtryk, at dir/file.ext
burde have været inkluderet; medmindre jeg forhåbentlig savner noget.
Kommentarer
Svar
Jeg gætter, det refererer kun til underkatalogniveauet . **
uden /
matcher
-
alle filer og mapper
-
nul eller flere underkataloger
Men det forsvinder ikke helt. **/
betyder, at ingen filer i kataloget på det højeste niveau, som **
gælder for, matches.
Du har brug for dir/*.ext dir/**/*.ext
.
Kommentarer
- Ja, det er nøjagtigt min tilbagefald, det ser bare ikke smukt ud. 😉
Svar
Dette fungerer som forventet i disse versioner af Bash som leveret med de anførte distributioner :
- 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
Faktisk er de ovennævnte versioner alt, hvad jeg testede. Med andre ord fandt jeg ikke en version 4 af Bash, hvor den ikke fungerer. Indstillingen globstar
blev tilføjet i Bash 4.0 se ÆNDRINGER . I ældre versioner skal kommandoen shopt -s globstar
returnere en fejl.
Test
1 . dir/**/*.ext
matcher dir/file.ext
:
~/tests$ ls -1 dir/**/*.ext dir/file.ext dir/subdir1/file.ext dir/subdir2/file.ext
2. **/*.ext
matcher file.ext
:
~/tests$ cd dir ~/tests/dir$ ls -1 **/*.ext file.ext subdir1/file.ext subdir2/file.ext
Forberedelse af miljøet til gengivelse af testene ovenfor:
mkdir -p dir/subdir{1,2} touch dir/{,subdir{1,2}/}file.ext shopt -s globstar
Kommentarer
- dette er rigtige svar. OP glemte at indstille
shopt -s globstar
.
Svar
I ser ud til at du har / har slået globstar fra. Det kan tændes på denne måde:
shopt -s globstar
Ikke kun matcher det ikke nul underkataloger, men det matcher heller ikke to underkataloger:
$ 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 slået fra, ender ** med at opføre sig som *, så dir/**/*.ext
får det samme resultat som dir/*/*.ext
$ echo dir/*/*.ext dir/subdir1/file.ext dir/subdir2/file.ext
som nogle gange narrer mig til at tænke globstar er slået til
tjek din nuværende globstar-indstilling som dette:
shopt | grep globstar
Kommentarer
- Du kan kontrollere en shell-indstilling direkte, som i
shopt globstar
.
ɀ
?unicode ɀ
eller Wikipediaɀ
er bare et tegn, der bruges her til at skelne mellem prompt. Nogle brugere foretrækker tegnet£
eller€
i stedet for$
:). Oprindeligtɀ
a ' z ' tegn oprettet til en særlig afrikansk sprognotation: – )