rätt sätt att iterera genom innehåll i en katalog [duplikat]

<åt sidan class = "s-notice s-notice__info js-post-notice mb16" role = "status">

Denna fråga har redan svar här :

Svar

Du behöver bara för att skapa en lista med globmatchande filer, åtskilda av mellanslag:

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

Redigera

Ovanstående kan skrivas om i olika former med hjälp av brace-expansion

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

eller ännu kortare : for file in {.,}*; do echo "$file"; done

Lägga till sökvägen för valda filer:

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

Lägga till sökväg för vald filer:

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

Om du vill vara sofistikerad och ta bort från listan vanligtvis onödigt . och

ändra bara {.,}* till {..?,.[!.],}*.

För fullständighet är det värt för att nämna att man också kan ställa in dotglob så att de matchar dot-filer med ren *.

shopt -s dotglob 

I zsh behöver man dessutom ställa in nullglob för att förhindra felet vid inga matchningar:

setopt nullglob 

eller alternativt lägga till globkvalificering N till mönstret:

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

Kommentarer

  • Tack så mycket! Så om jag vill itera igenom någon katalog lägger jag bara katalognamnet framför var och en av objekten, eller hur? som for file in dir/.* dir/*; do
  • Det ' är inte så lätt. .* matchar . och .. (utom i zsh). * förblir * om det inte finns någon matchande fil. shopt -s gotglob är bara i bash.
  • Jag får zsh: no matches found: .* när jag kör kommandot (erna) i det här svaret . Varför skulle detta hända? ls i katalogen visar filerna.
  • @Niyaz att ' s eftersom zsh returnerar fel om något mönster inte tändstickor. För att förhindra den körningen setopt nullglob som stänger av denna funktion globalt, eller lägg till kvalificering (N) efter globstjärnan, dvs: for file in /path/{.,}*(N); do echo "$file"; done.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *