Il modo migliore per espandere il modello glob?


29

Ho bisogno di espandere un modello glob (come ../smth*/*, o /etc/cron*/) in un elenco di file, a livello di codice. Quale sarebbe il modo migliore per farlo?


2
Non devi fare nulla di speciale, ma non citare il *.
Kevin,

1
Tuttavia, se stai cercando di analizzarlo, usa un array come dice la risposta.
Kevin,

Risposte:


40

Lascialo espandere all'interno del lato destro di una dichiarazione di array:

list=(../smth*/)          # grab the list
echo "${#list[@]}"        # print array length
echo "${list[@]}"         # print array elements
for file in "${list[@]}"; do echo "$file"; done  # loop over the array


Si noti che è nullglobnecessario impostare l'opzione shell .
Non è impostato di default.
Previene un errore nel caso in cui il glob (o uno di più globs) non corrisponda a nessun nome.

Impostalo bashcon

shopt -s nullglob

o in zshcon

setopt nullglob

E come faccio a stampare l'elenco in seguito?
Rogach,

È solo un array normale. Puoi fare tutto il possibile con qualsiasi array. Aggiunti alcuni esempi.
arte

1
C'è un problema. Se il modello non corrisponde a nessun file, viene stampato automaticamente, il che non è molto buono.
Rogach,

5
Ah, lo shopg-nullglob lo risolve.
Rogach,

1
@lindhe unsetopte lo stesso parametro utilizzato per setopt.
arte

-1

Non c'è bisogno di complicare eccessivamente le cose:

echo your/stuff*

questo non funziona. Ad esempio: TEST=$(echo your/stuff*) && eval \"$TEST\"uscirà:your/stuff*: No such file or directory
Sebastian il

@Sebastian questo è un problema nullglob, vedi sopra
Alexei Averchenko

1
No, non è un problema nullglob. L'uso di caratteri scape sta valutando la TESTvariabile come una stringa che include *e non viene espansa.
Sebastian
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.