전역 일치에서 패턴 제외

전역 일치에서 패턴 제외

내 디렉터리는 다음과 같습니다.

$ 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

file2bash 와일드카드를 사용하여 일치시키고 싶습니다 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])

확장된 와일드카드를 참조하세요.

관련 정보