2 이름 조건을 찾기에 결합하는 방법은 무엇입니까?


94

두 가지 -name조건 과 일치하지 않는 파일을 검색하고 싶습니다 . 나는 그렇게 할 수 있습니다 :

find /media/d/ -type f -size +50M ! -name "*deb" ! -name "*vmdk"

그리고 이것은 적절한 결과를 얻을 수 있지만 어떻게 든이 2 가지 조건을 OR로 결합 할 수 있습니까?

답변:


46

negated를 사용 하여이 작업을 수행 할 수도 -regex있습니다.

 find ./ ! -regex  '.*\(deb\|vmdk\)$'

6
그 주 -regex미만의 휴대용입니다 -name.
jw013

145

그래 넌 할수있어:

find /media/d/ -type f -size +50M ! \( -name "*deb" -o -name "*vmdk" \)

POSIX 사양의 설명 :

! 표현 : 기본의 부정; 단항 NOT 연산자

( expression ) : expression이 true이면 true입니다.

expression -o expression : 1 차 교체; OR 연산자 첫 번째 표현이 참이면 두 번째 표현은 평가되지 않습니다.

\쉘에 의한 평가를 방지하기 위해 여는 괄호와 닫는 괄호 앞에 백 슬래시 ( ) 가 붙습니다 .


2
결과 -exec에 대해 수행 하거나 다른 조치를 수행하는 경우 전체 기준 find을 괄호로 묶어야 \( \)합니다. 그렇지 않으면 -exec마지막 -or기준 에만 적용됩니다 . 그들 모두를 위해 괄호로 묶어 find \( <criterion> -o <criterion> \) -exec <command>
놓으십시오

25

당신은 해결책에 가까웠습니다.

find /media/d/ -type f -size +50M -and ! -name "*deb" -and ! -name "*vmdk"

다음 논리 연산자를 순서대로 결합 할 수 있습니다.

-a   -and      - operator AND
-o   -or       - operator OR
!              - operator NOT

6

다음과 같이 정규식을 사용할 수 있습니다.

find /media/d -type f -size +50M ! -regex '\(.*deb\|.*vmdk\)'

백 슬래시는 이스케이프 문자입니다. .단일 문자와 *일치하고 이전 문자를 0 번 이상 일치시키는 역할을하므로 .*0 개 이상의 문자 일치를 의미합니다.


1
설명을 추가하면 답변이 더 나아질 것입니다.
NN

네가 옳아. 설명이 추가되었습니다.
Francesco Turco
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.