korrekt måde at gentage gennem indholdet i en mappe [duplikat]

Dette spørgsmål har allerede svar her :

Svar

Du skal bare bruge for at oprette en liste med glob-matchende filer adskilt af mellemrum:

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

Rediger

Ovenstående kan omskrives i forskellige former ved hjælp af bøjleudvidelse

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

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

Tilføjelse af stien til valgte filer:

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

Tilføjelse af sti til valgte filer:

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

Hvis du vil være sofistikeret og fjerne fra listen normalt unødvendigt . og

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

For fuldstændighed er det værd at nævne, at man også kan indstille dotglob til at matche dot-filer med ren *.

shopt -s dotglob 

I zsh skal man desuden indstille nullglob for at forhindre fejlen i tilfælde af manglende matches:

setopt nullglob 

eller alternativt tilføj globkvalifikator N til mønsteret:

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

Kommentarer

  • Mange tak! Så hvis jeg vil gentage gennem et hvilket som helst bibliotek, sætter jeg bare katalognavnet foran hvert af elementerne, ikke? som for file in dir/.* dir/*; do
  • Det ' er ikke så let. .* matcher . og .. (undtagen i zsh). * forbliver * hvis der ikke er nogen matchende fil. shopt -s gotglob er kun i bash.
  • Jeg får zsh: no matches found: .*, når jeg kører kommand (er) i dette svar . Hvorfor skulle dette ske? ls i biblioteket viser filerne.
  • @Niyaz at ' s fordi zsh returnerer fejl, hvis noget mønster ikke Tændstikker. For at forhindre det kør setopt nullglob, som vil slå denne funktion fra globalt, eller tilføj kvalifikator (N) efter globstjernen, dvs.: for file in /path/{.,}*(N); do echo "$file"; done.

Skriv et svar

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