juiste manier om de inhoud in een map te doorlopen [duplicate]

Deze vraag heeft hier al antwoorden :

Antwoord

Je hoeft alleen maar om een lijst met glob-overeenkomende bestanden te maken, gescheiden door een spatie:

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

Bewerken

De bovenstaande kan in een andere vorm worden herschreven met behulp van accolade-uitbreiding

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

of zelfs korter : for file in {.,}*; do echo "$file"; done

Pad voor geselecteerde bestanden toevoegen:

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

Pad toevoegen voor geselecteerde bestanden:

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

Als u verfijnd wilt zijn en uit de lijst wilt verwijderen die meestal niet nodig is . en

verander gewoon {.,}* naar {..?,.[!.],}*.

Voor de volledigheid is het de moeite waard om te vermelden dat men dotglob ook kan instellen om dot-bestanden te matchen met pure *.

shopt -s dotglob 

In zsh moet men bovendien nullglob instellen om de fout te voorkomen in het geval van geen overeenkomsten:

setopt nullglob 

of voeg als alternatief glob kwalificatie N toe aan het patroon:

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

Opmerkingen

  • Heel erg bedankt! Dus als ik een map wil doorlopen, plaats ik gewoon de mapnaam voor elk van de items, toch? zoals for file in dir/.* dir/*; do
  • Het ' is niet zo eenvoudig. .* komt overeen met . en .. (behalve in zsh). * blijft * als er geen overeenkomend bestand is. shopt -s gotglob is alleen in bash.
  • Ik krijg zsh: no matches found: .* wanneer ik de opdracht (en) in dit antwoord uitvoer . Waarom zou dit gebeuren? ls in de directory toont de bestanden.
  • @Niyaz die ' s omdat zsh een fout retourneert als een patroon nee wedstrijden. Om dat te voorkomen voer je setopt nullglob uit waardoor deze functie wereldwijd wordt uitgeschakeld, of voeg een kwalificatie (N) toe na de glob-ster, dat wil zeggen: for file in /path/{.,}*(N); do echo "$file"; done.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *