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
for file in dir/.* dir/*; do
.*
komt overeen met.
en..
(behalve in zsh).*
blijft*
als er geen overeenkomend bestand is.shopt -s gotglob
is alleen in bash.zsh: no matches found: .*
wanneer ik de opdracht (en) in dit antwoord uitvoer . Waarom zou dit gebeuren? ls in de directory toont de bestanden.zsh
een fout retourneert als een patroon nee wedstrijden. Om dat te voorkomen voer jesetopt 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
.