Najlepszy sposób na rozszerzenie globalnego wzorca?

29

Muszę programowo rozwinąć wzorzec globalny (jak ../smth*/*lub /etc/cron*/) do listy plików. Jaki byłby najlepszy sposób na to?

Rogach
źródło
2
Nie musisz robić nic specjalnego, tylko nie cytuj *.
Kevin
1
Chociaż jeśli chcesz to przeanalizować, użyj tablicy, jak mówi odpowiedź.
Kevin

Odpowiedzi:

40

Po prostu pozwól mu rozwinąć się po prawej stronie deklaracji tablicowej:

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


Pamiętaj, że nullglobnależy ustawić opcję powłoki .
To nie jest ustawione domyślnie.
Zapobiega to błędom w przypadku, gdy glob (lub jeden z wielu globów) nie pasuje do żadnej nazwy.

Ustaw za bashpomocą

shopt -s nullglob

lub zshz

setopt nullglob
człowiek w pracy
źródło
Jak wydrukować tę listę później?
Rogach,
To tylko zwykła tablica. Możesz zrobić, co możesz, z dowolną tablicą. Dodano kilka przykładów.
manatwork
1
Tam jest problem. Jeśli wzór nie pasuje do żadnego pliku, drukuje się sam - co nie jest zbyt dobre.
Rogach,
5
Ach, shopt -s nullglob rozwiązuje to.
Rogach,
1
@lindhe unsetopti ten sam parametr, co używany dla setopt.
manatwork,
0

Nie trzeba nadmiernie komplikować rzeczy:

echo your/stuff*
Aleksiej Averchenko
źródło
to nie działa. Na przykład: TEST=$(echo your/stuff*) && eval \"$TEST\"wyświetli:your/stuff*: No such file or directory
Sebastian
@Sebastian jest to problem nullglob, patrz wyżej
Alexei Averchenko
1
Nie, to nie jest problem nullglob. Używanie znaków scape ocenia TESTzmienną jako ciąg zawierający *i nie rozwijany.
Sebastian