Jeg har denne katalogstrukturen:
~/tmp/globstar ɀ find dir -type f dir/file.ext dir/subdir1/file.ext dir/subdir2/file.ext
og, med globstar
alternativet aktivert i Bash, jeg kan si:
~/tmp/globstar ɀ ls -1 dir/**/*.ext dir/subdir1/file.ext dir/subdir2/file.ext
Spørsmålet mitt er: hvorfor er dir/file.ext
ekskludert fra denne listen?
Bash manual sier dette om globstar
:
Hvis angitt, vil mønsteret ** som brukes i en filnavnutvidelsessammenheng, matche alle filer og null eller flere kataloger og underkataloger. Hvis mønsteret følges av et /, er det bare kataloger og underkataloger som samsvarer.
“ null ”i dette avsnittet la meg med inntrykk av at dir/file.ext
burde vært inkludert; med mindre jeg forhåpentligvis savner noe.
Kommentarer
Svar
Jeg antar at det kun refererer til underkatalognivået . **
uten /
samsvarer
-
alle filer og kataloger
-
null eller flere underkataloger
Men det forsvinner ikke helt. **/
betyr at ingen filer i katalogen på høyeste nivå som **
gjelder, samsvarer.
Du trenger dir/*.ext dir/**/*.ext
.
Kommentarer
- Ja, det er akkurat min reserve, det ser bare ikke pent ut. 😉
Svar
Dette fungerer som forventet i disse versjonene av Bash som følger med de oppførte distribusjonene :
- 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
Versjonene ovenfor er faktisk alt jeg testet. Med andre ord fant jeg ikke en versjon 4 av Bash der den ikke fungerer. Alternativet globstar
ble lagt til i Bash 4.0 se ENDRINGER . I eldre versjoner skal kommandoen shopt -s globstar
returnere en feil.
Tester
1 . dir/**/*.ext
samsvarer med dir/file.ext
:
~/tests$ ls -1 dir/**/*.ext dir/file.ext dir/subdir1/file.ext dir/subdir2/file.ext
2. **/*.ext
samsvarer med file.ext
:
~/tests$ cd dir ~/tests/dir$ ls -1 **/*.ext file.ext subdir1/file.ext subdir2/file.ext
Forbereder miljøet for å gjengi testene ovenfor:
mkdir -p dir/subdir{1,2} touch dir/{,subdir{1,2}/}file.ext shopt -s globstar
Kommentarer
- dette er riktig svar. OP glemte å sette
shopt -s globstar
.
Svar
I ser ut til at du har / hadde slått av globstar. Den kan slås på slik:
shopt -s globstar
Ikke bare vil den ikke matche null underkataloger, men den vil heller ikke matche 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 av, ender ** opp med å oppføre seg akkurat som *, så dir/**/*.ext
får samme resultat som dir/*/*.ext
$ echo dir/*/*.ext dir/subdir1/file.ext dir/subdir2/file.ext
som noen ganger lurer meg til å tro at globstar er på
sjekk din nåværende globstar-innstilling som dette:
shopt | grep globstar
Kommentarer
- Du kan sjekke innstillingen for skallalternativ direkte, som i
shopt globstar
.
ɀ
?unicode ɀ
eller Wikipediaɀ
er bare et tegn som brukes her for å skille mellom spørsmål. Noen brukere foretrekker tegnet£
eller€
i stedet for$
:). Opprinnelig bleɀ
a ' z ' tegn opprettet for en spesiell afrikansk språknotasjon: – )