<å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
for file in dir/.* dir/*; do
.*
matchar.
och..
(utom i zsh).*
förblir*
om det inte finns någon matchande fil.shopt -s gotglob
är bara i bash.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.zsh
returnerar fel om något mönster inte tändstickor. För att förhindra den körningensetopt 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
.