Hai solo bisogno per creare un elenco di file corrispondenti glob, separati da uno spazio:
for file in .* *; do echo "$file"; done
Modifica
Quello sopra può riscrivere in forma diversa usando lespansione delle parentesi graffe
for file in {.*,*}; do echo "$file"; done
o anche più breve : for file in {.,}*; do echo "$file"; done
Aggiunta del percorso per i file selezionati:
for file in /path/{..?,.[!.],}*; do echo "$file"; done
Aggiunta del percorso per i file selezionati file:
for file in /path/{.,}*; do echo "$file"; done
Se vuoi essere sofisticato e rimuovere dallelenco di solito non necessari .
e
basta cambiare {.,}*
in {..?,.[!.],}*
.
Per completezza vale la pena per menzionare che si può anche impostare dotglob in modo che corrisponda a file punto con *
.
shopt -s dotglob
In zsh
è necessario inoltre impostare nullglob
per evitare lerrore in caso di mancata corrispondenza:
setopt nullglob
o, in alternativa, aggiungi il qualificatore glob N
al pattern:
for file in /path/{.,}*(N); do echo "$file"; done
Commenti
for file in dir/.* dir/*; do
.*
corrisponde a.
e..
(tranne che in zsh).*
rimane*
se non è presente alcun file corrispondente.shopt -s gotglob
è solo in bash.zsh: no matches found: .*
quando eseguo i comandi in questa risposta . Perché dovrebbe succedere? È nella directory che mostra i file.zsh
restituisce un errore se qualche pattern no partite. Per evitare che venga eseguitosetopt nullglob
che disattiverà questa funzione a livello globale, oppure aggiungi il qualificatore(N)
dopo la stella glob, ad esempio:for file in /path/{.,}*(N); do echo "$file"; done
.