riktig måte å iterere gjennom innholdet i en katalog [duplikat]

Dette spørsmålet har allerede svar her :

Svar

Du trenger bare for å lage en liste over glob-samsvarende filer, atskilt med mellomrom:

for file in .* *; do echo "$file"; done 

Rediger

Ovennevnte kan omskrives i annen form ved hjelp av avstivningsutvidelse

 for file in {.*,*}; do echo "$file"; done 

eller enda kortere : for file in {.,}*; do echo "$file"; done

Legger til banen for valgte filer:

 for file in /path/{..?,.[!.],}*; do echo "$file"; done 

Legger til sti for valgte filer:

 for file in /path/{.,}*; do echo "$file"; done 

Hvis du vil være sofistikert og fjerne fra listen, er det unødvendig . og

bare endre {.,}* til {..?,.[!.],}*.

For fullstendighet er det verdt å nevne at man også kan stille dotglob til å matche dot-filer med ren *.

shopt -s dotglob 

I zsh trenger man i tillegg å sette nullglob for å forhindre feilen ved manglende samsvar:

setopt nullglob 

eller alternativt legg til glob-kvalifikator N i mønsteret:

for file in /path/{.,}*(N); do echo "$file"; done 

Kommentarer

  • Tusen takk! Så hvis jeg vil gjenta gjennom en hvilken som helst katalog, legger jeg bare katalognavnet foran hvert av elementene, ikke sant? som for file in dir/.* dir/*; do
  • Det ' er ikke så lett. .* samsvarer med . og .. (unntatt i zsh). * forblir * hvis det ikke er noen samsvarende fil. shopt -s gotglob er bare i bash.
  • Jeg får zsh: no matches found: .* når jeg kjører kommandoen (e) i dette svaret . Hvorfor skulle dette skje? I katalogen vises filene.
  • @Niyaz at ' s fordi zsh returnerer feil hvis noe mønster ikke fyrstikker. For å forhindre at kjøringen setopt nullglob som vil slå av denne funksjonen globalt, eller legge til kvalifikator (N) etter globstjernen, dvs.: for file in /path/{.,}*(N); do echo "$file"; done.

Legg igjen en kommentar

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