zsh
:set -o extendedglob # best in ~/.zshrc
ls -ld -- *green*~^*red*
Оператор ~
glob предназначен для except (and not). ^
- для not. Значит, комбинация и не, поэтому и. То есть, это соответствует файлам с зеленым
в их именах, кроме тех, которые не содержат красный
.
Альтернатива с использованием оператора отрицания ^
(также требует extendedglob
):
ls -ld -- ^(^*green*|^*red*)
все, кроме файлов, которые либо не содержат зеленый, либо не содержат красный.
Чтобы включить также скрытые файлы, добавьте квалификатор (D)
glob.
Вы также можете использовать квалификаторы glob для сопоставления имен файлов с regexps, а с помощью setopt rematchpcre
вы можете сделать эти regexps PCRE, где вы можете использовать операторы look ahead для достижения and:
re() {
setopt localoptions rematchpcre
[[ $REPLY =~ $1 ]]
}
ls -ld -- *(e:'re "^(?=.*green).*red"':)
Or:
re() {
setopt localoptions rematchpcre
[[ $REPLY =~ $RE ]]
}
RE='^(?=.*green).*red'; ls -ld -- *(+re)
ksh
или bash -O extglob
или zsh -o kshglob
ls -ld -- !(!(*green*)|!(*red*))
! (pattern)
является ksh
эквивалентом zsh
оператора ^pattern
расширенного glob.
Вы также можете сделать:
ls -ld -- @(*green*red*|*red*green*)
Но это не обобщается на любой шаблон. Например, для файлов, содержащих abc
и bcd
, вам понадобится @(*abc*bcd*|*abcd*|*bcd*abc*)
, для файлов, соответствующих ? ??
и *x*
, @(x??|?x?|??x)
...
кш93
кш93
имеет некоторые и globbing операторы:
ls -ld -- @(*green*&*red*)
Или используя его дополненные regexps (введенные с ~(A:.... )
оператором glob):
ls -ld -- ~(A:.*green.*&.*red.*)
Вы также можете использовать perl-подобные
операторы look ahead в ksh93
:
ls -ld -- ~(P:(?=.*green).*red.*)