내 디렉터리는 다음과 같습니다.
$ ls
total 0
-rw-r--r-- 1 user user 0 Jun 18 22:44 file0
-rw-r--r-- 1 user user 0 Jun 18 22:44 file1
-rw-r--r-- 1 user user 0 Jun 18 22:44 file2
-rw-r--r-- 1 user user 0 Jun 18 22:44 file3
-rw-r--r-- 1 user user 0 Jun 18 22:44 file4
-rw-r--r-- 1 user user 0 Jun 18 22:44 file5
-rw-r--r-- 1 user user 0 Jun 18 22:44 file6
-rw-r--r-- 1 user user 0 Jun 18 22:44 file7
-rw-r--r-- 1 user user 0 Jun 18 22:44 file8
-rw-r--r-- 1 user user 0 Jun 18 22:44 file9
file2
bash 와일드카드를 사용하여 일치시키고 싶습니다 file6
.들어오지 못하게 하다 file3
.
and
여러 패턴과 일치하는 연산자를 찾을 수 없기 때문에 와 a AND b
동등한 De Morgan의 법칙을 사용하면 될 것이라고 생각했습니다.!(!a OR !b)
!(!(file[2-6])|file3)
예상대로 작동합니다.
$ echo !(!(file[2-6])|file3)
file2 file4 file5 file6
이를 달성하는 더 쉽고 직접적인 방법이 있습니까?
답변1
두 가지 범위를 적용할 수 있습니다 [24-6]
. 여기서 2
는 첫 번째이고 4-6
두 번째는 다음과 같습니다.
$ ls file[24-6]
file2 file4 file5 file6
다른 예시:
$ ls file[2356]
file2 file3 file5 file6
범위
특별한 규칙이 있습니다. "-"로 구분된 두 문자는 범위를 나타냅니다. (따라서 "[A-Fa-f0-9]"는 "[ABCDEFabcdef0123456789]"와 동일합니다.) "-"를 괄호 사이의 첫 번째 또는 마지막 문자로 사용하여 문자 그대로의 의미를 포함할 수 있습니다. (그래서 "[]-]"는 "]"와 "-" 두 문자만 일치하고 "[--0]"은 "-", ".", "0" 세 문자와 일치합니다. 왜냐하면 "/ "와 일치할 수 없습니다.)
답변2
부정 범위:
printf '%s\n' file[!013789]
"[" 뒤의 첫 번째 문자가 "!" 또는 '^'이면 포함되지 않은 문자가 일치됩니다.
GLOBIGNORE
건너뛰려는 파일로 설정합니다 .
GLOBIGNORE="file0:file1:file3:file7:file8:file9"
printf '%s\n' file*
GLOBIGNORE 쉘 변수를 사용하여 패턴과 일치하는 파일 이름 세트를 제한할 수 있습니다. GLOBIGNORE가 설정된 경우 GLOBIGNORE의 패턴 중 하나와 일치하는 각 일치 파일 이름이 일치 목록에서 제거됩니다.
사용 extended globbing
:
shopt -s extglob
printf '%s\n' file!([013789])