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.zshrestituisce un errore se qualche pattern no partite. Per evitare che venga eseguitosetopt nullglobche 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.