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

  • Hva er denne karakteren? ɀ?
  • Hvilken versjon av bash, på hvilken plattform? Jeg kan ' t gjengi 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 melding?
  • slm, ja! ɀ 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: – )
  • " GNU bash, versjon 3.2.53 (1) -release (x86_64-apple-darwin13) " leveres med OS X 10.9 har denne oppførselen.

Svar

Jeg antar at det kun refererer til underkatalognivået . ** uten / samsvarer

  1. alle filer og kataloger

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

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *