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?


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

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*

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.