Скажем, у меня есть следующие файлы:
|-- bar `-- foo |-- type_A_1 |-- type_A_2 |-- type_B_1 |-- type_B_2 |-- type_B_xx |-- type_B_xx `-- something_else
Я думал, что следующая команда
print -l foo/*~{type_B*}
будет печатать все под, foo
кроме вещей, которые начинаются с, type_B
но это не так, вместо этого он печатает все под foo:
foo/type_A_1
foo/type_A_2
foo/type_B_1
foo/type_B_2
foo/type_B_xx
foo/something_else
Я тоже попробовал print -l foo/*~type_B
и получил то же самое.
Как работает подстановочный знак исключения ~
в Zsh?
shell-script
zsh
wildcards
Амелио Васкес-Рейна
источник
источник
foo/*~*/type_A*
работает? Второй*
расширяется до каждой папки в рабочем каталоге, или он достаточно умен, чтобы расширяться только доfoo
?print *~**/*
в/
каталоге), я предполагаю, что он сначала раскрывает первый шаблон, а затем удаляет все совпадения, которые соответствуют шаблону исключения.~
является чисто текстовым, часть перед раскрытием, как обычно, будет~
расширяться, а затем часть после удаления совпадает. Ofjofel Лучшим тестом было быprint /**/*~*
: вы можете наблюдать, как оно проходит по всему дереву, даже если оно ничего не печатает.У zsh есть
^
оператор glob, когда EXTENDED_GLOB включен. Похоже, идеально подходит для вашей заявленной ситуации:Это означает «сопоставлять что-либо, кроме того, что соответствует следующему шаблону», но его эффект ограничен частью шаблона между косыми чертами, или между началом шаблона и первым слешем, или (как в этом случае) между последним косая черта и конец рисунка.
Вы можете просмотреть опции zsh , которые в данный момент включены:
И отключите EXTENDED_GLOB с помощью:
источник