Powiedz, że mam następujące pliki:
|-- bar `-- foo |-- type_A_1 |-- type_A_2 |-- type_B_1 |-- type_B_2 |-- type_B_xx |-- type_B_xx `-- something_else
Pomyślałem następującą komendę
print -l foo/*~{type_B*}
wypisuje wszystko poniżej foo
oprócz rzeczy, które zaczynają się od, type_B
ale nie, zamiast tego wypisuje wszystko pod foo:
foo/type_A_1
foo/type_A_2
foo/type_B_1
foo/type_B_2
foo/type_B_xx
foo/something_else
Próbowałem też print -l foo/*~type_B
i dostałem to samo.
Jak działa znak wieloznaczny wyjątku ~
w Zsh?
shell-script
zsh
wildcards
Amelio Vazquez-Reina
źródło
źródło
foo/*~*/type_A*
działa wzór ? Czy drugi*
rozwija się do każdego folderu w katalogu roboczym, czy jest na tyle inteligentny, aby tylko rozwinąćfoo
?print *~**/*
w/
katalogu), zakładam, że najpierw rozwija on pierwszy wzorzec, a następnie usuwa wszystkie dopasowania pasujące do wzorca wykluczenia.~
jest czysto tekstowy, część przed rozwinięciem~
rozwija się jak zawsze, a następnie część po usunięciu dopasowań. @Jofel Lepszym testem byłobyprint /**/*~*
: można zauważyć, że przemierza całe drzewo, nawet jeśli nic nie wydrukuje.zsh ma
^
operatora globalnego, gdy EXTENDED_GLOB jest włączony. Wydaje się, że idealnie pasuje do podanej sytuacji:Oznacza „dopasuj wszystko, z wyjątkiem tego, co pasuje do następującego wzoru”, ale jego działanie jest ograniczone do części wzoru między ukośnikami lub między początkiem wzoru a pierwszym ukośnikiem lub (jak w tym przypadku) między ostatnim cięcie i koniec wzoru.
Możesz wyświetlić zsh opcje aktualnie włączone za pomocą:
I wyłącz EXTENDED_GLOB za pomocą:
źródło