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

  • Hvad er denne karakter? ɀ?
  • Hvilken version af bash, på hvilken platform? Jeg kan ' t gengive dette med bash 4.2.37 på Debian wheezy eller bash 4.1.5 på Debian squeeze. @slm unicode ɀ eller Wikipedia
  • @Gilles Er det en prompt?
  • slm, ja! ɀ 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: – )
  • " GNU bash, version 3.2.53 (1) -release (x86_64-apple-darwin13) " leveret med OS X 10.9 har denne adfærd.

Svar

Jeg gætter, det refererer kun til underkatalogniveauet . ** uden / matcher

  1. alle filer og mapper

  2. 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.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *