Mam tę strukturę katalogów:
~/tmp/globstar ɀ find dir -type f
dir/file.ext
dir/subdir1/file.ext
dir/subdir2/file.ext
a przy globstar
włączonej opcji w Bash mogę powiedzieć:
~/tmp/globstar ɀ ls -1 dir/**/*.ext
dir/subdir1/file.ext
dir/subdir2/file.ext
Moje pytanie brzmi: dlaczego jest dir/file.ext
wykluczony z tej listy?
Podręcznik Bash mówi o globstar
:
Jeśli jest ustawiony, wzorzec „**” użyty w kontekście rozszerzenia nazwy pliku będzie pasował do wszystkich plików i zero lub więcej katalogów i podkatalogów. Jeśli po wzorcu występuje znak „/”, tylko katalogi i podkatalogi są zgodne.
„ Zero ” w tym akapicie pozwala mi odnieść wrażenie, że dir/file.ext
należało go uwzględnić; chyba że mam nadzieję, że coś mi umknie.
ɀ
?unicode ɀ
lub Wikipediaɀ
to po prostu znak użyty tutaj do rozróżnienia monitu. Niektórzy użytkownicy wolą postać£
lub€
zamiast$
:). Pierwotnieɀ
znak „z” stworzony dla specjalnej notacji w języku afrykańskim :-)Odpowiedzi:
Myślę, że odnosi się to tylko do poziomu podkatalogu.
**
bez/
zapałekwszystkie pliki i katalogi
zero lub więcej podkatalogów
Ale to nie znika całkowicie.
**/
oznacza, że żadne pliki w katalogu najwyższego poziomu, które**
dotyczą, nie są dopasowane.Trzeba
dir/*.ext dir/**/*.ext
.źródło
Działa to zgodnie z oczekiwaniami w tych wersjach Bash dostarczanych z wymienionymi dystrybucjami:
W rzeczywistości wymienione powyżej wersje są wszystkim, co przetestowałem. Innymi słowy, nie znalazłem wersji 4 Bash, w której nie działa. Opcja
globstar
została dodana w Bash 4.0 patrz ZMIANY . W starszych wersjach polecenieshopt -s globstar
powinno zwrócić błąd.Testy
1.
dir/**/*.ext
meczedir/file.ext
:2.
**/*.ext
meczefile.ext
:Przygotowanie środowiska do odtworzenia powyższych testów:
źródło
shopt -s globstar
.Wygląda mi na ciebie, jakbyś wyłączył globstar. Można go włączyć w następujący sposób:
Nie tylko nie będzie pasował do zerowych podkatalogów, ale także nie będzie pasował do dwóch podkatalogów:
Przy wyłączonej globstar ** kończy się tak jak *, więc
dir/**/*.ext
otrzymuje ten sam wynik codir/*/*.ext
co czasem podpowiada mi, że globstar jest włączony
sprawdź swoje obecne ustawienie globstar w następujący sposób:
źródło
shopt globstar
.