Linux의 find 명령에서 2개 이상의 패턴을 제외할 수 없는 이유는 무엇입니까?

Linux의 find 명령에서 2개 이상의 패턴을 제외할 수 없는 이유는 무엇입니까?

.svg내 find 명령에서 및 파일을 제외하려고 시도하고 있지만 .jpg여전히 두 파일이 모두 반환됩니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

find . \( ! -iname \*\.svg -o ! -iname \*\.jpg \)

답변1

귀하의 논리에는 결함이 있습니다. 지금 가지고 있는 명령을 사용하면 파일이 아닌 모든 .svg파일 을 찾을 수 있습니다 .jpg. 당신이 쓴 내용은 다음과 같습니다.

찾기(SVG가 아닌 모든 것또는JPG가 아닌 모든 것)

find따라서 이미 첫 번째 부분을 평가하고 SVG 파일이 아닌 모든 것을 제공했기 때문에 JPG 파일을 얻게 됩니다 . 옵션이 구문 분석되는 방식으로 인해 표현식의 첫 번째 부분이 ortrue로 평가되면 두 번째 부분은 살펴보지도 않습니다.

본질적으로 findSVG가 아닌 모든 것을 반환하면 JPG 파일에서 원하는 것이 무엇인지는 신경 쓰지 않습니다.


이것을 표현하는 올바른 방법은 논리적입니다 and.

find . \( ! -iname '*.svg' -a ! -iname '*.jpg' \)

이는 다음과 같습니다:

찾기(SVG가 아닌 모든 것그리고JPG가 아닌 모든 것)

또는 전체 표현을 부정함으로써:

find . ! \(-iname '*.svg' -o -iname '*.jpg' \)

다음과 같이 읽습니다.

SVG가 아닌 모든 것을 찾아보세요또는JPG)

*예를 들어 작은따옴표나 큰따옴표로 묶으면 이스케이프를 건너뛸 수 있습니다 -iname '*.jpg'. 이것은 읽기가 훨씬 쉽습니다.

관련 정보