테스트 플래그가 없는데 왜 "find"는 검색 중인 디렉토리만 인쇄합니까?

테스트 플래그가 없는데 왜 "find"는 검색 중인 디렉토리만 인쇄합니까?

bash와 유사한 명령을 실행하면 sudo find . "*dev/null"쉘은 표현식과 일치하는 디렉토리와 일치하는 항목을 검색하는 모든 디렉토리를 인쇄합니다.

그러나 테스트 조건(예: )을 추가하는 플래그를 발행하면 sudo find . -wholename "*dev/null"쉘은 내가 검색하는 표현식과 일치하는 디렉토리(및 액세스할 수 없는 디렉토리)만 인쇄합니다.

매뉴얼 페이지를 보았지만 find명령에 테스트를 추가하면 왜 발생하는지 설명하는 내용을 찾을 수 없습니다.아니요검색된 각 디렉토리를 인쇄합니다. 이 find명령이 테스트 인스턴스에서 인쇄되지 않는 이유를 설명할 수 있는 사람이 있습니까?

답변1

그리고 둘 sudo find . "*dev/null"다 에서.*dev/null출발점. 모든 것이 일치한다는 명시적인 테스트는 없습니다. 달릴 때와 거의 비슷해요

sudo find .
sudo find "*dev/null"

후자가 인쇄할 가능성이 가장 높지만 find: '*dev/null': No such file or directory전자는 다음을 찾습니다.모든 것존재하다 ..

sudo find . -wholename "*dev/null"스니펫에는 -wholename "*dev/null"실제 테스트가 있습니다.


~에서POSIX 사양, 다음 스니펫이 관련됩니다.

유틸리티 find는 path로 지정된 각 파일에서 디렉토리 계층 구조를 반복적으로 내려와 각 파일의 OPERANDS 섹션에 설명된 기본 색상으로 구성된 부울 표현식을 평가해야 합니다.

표현식이 없으면 -print표현식으로 사용해야 합니다.

-print
기본은 항상 true로 평가되어야 하며 현재 경로 이름이 표준 출력에 기록됩니다.

당신의 sudo find . "*dev/null"것은 사실입니다 sudo find . "*dev/null" -print. 어떤 테스트도 이 이전에 표현식 평가를 중지 -print할 수 없으므로 도달한 find테스트의 모든 경로 이름에 대해 모든 경로 이름이 인쇄됩니다.-print

더 많은 클립:

( expression )
사실 이라면 사실입니다 expression.

expression [-a] expression
기본 연산자의 조합, AND 연산자는 두 기본 연산자의 병치에 의해 암시되거나 -a선택적 연산자에 의해 명시됩니다. 첫 번째 표현식이 false이면 두 번째 표현식을 평가하면 안 됩니다.

표현식이 없으면 -print표현식으로 사용해야 합니다. 그렇지 않고 주어진 표현식에 기본 색상 또는 -exec가 포함되어 있지 않으면 주어진 표현식은 다음으로 효과적으로 대체됩니다.-ok-print

( given_expression ) -print

-exec참고: 구현은 , -ok, 컬렉션에 추가될 수 있습니다 -print.

귀하의 sudo find . -wholename "*dev/null"동등한

sudo find . \( -wholename "*dev/null" \) -a -print

(대괄호는 쉘에 특별하기 때문에 이스케이프됩니다.)

이제 -wholename "*dev/null"false로 평가되면 그렇게 작동하므로 -print평가되지 않습니다 . -a이렇게 하면 주어진 경로 이름에 대한 테스트가 실패하면 find경로 이름이 인쇄되지 않습니다.


노트:

  • POSIX가 아닌 확장은 도구의 전반적인 아이디어를 변경해서는 안됩니다.
  • -wholenamePOSIX에서는 필요하지 않습니다. 여전히 GNU에서는 POSIX에서 지정한 find것과 동일합니다 .-path
  • 당신은 찾을 수 있습니다내 다른 답변흥미로운.

관련 정보