[unix] 찾기가 찾은 디렉토리로 내려가는 것을 중지하려면 어떻게해야합니까?

포함 된 파일에서 다른 찾기를 수행 할 수 있도록 특정 문자열이있는 모든 디렉토리를 찾고 싶습니다.

그래서 나는 시간을 낭비하고 싶지 않습니다 ./my-search-term/dir/my-search-term.

첫 번째 검색어 디렉토리를 찾았을 때 어떻게 되풀이를 멈출 수 있습니까?



답변

-prune조치가 만드는 find디렉토리에없는 같이 Recurse. -exec( 어느 쪽이든 실행되는 한 순서는 중요하지 않습니다) -prune와 같은 다른 조치와 결합 할 수 있습니다 .-exec-prune

find . -name my-search-term -prune -exec find {} … \;

find내부에 중첩 하는 find -exec것은 약간 문제 가 될 수 있습니다. 터미네이터는 outer에 의해 터미네이터로 표시되므로 -execinner에서 사용할 수 없습니다 . 쉘을 호출하여 따옴표를주의하여 해결할 수 있습니다.findfind

find . -name my-search-term -prune -exec sh -c '
    find "$@" … -exec … {\} +
' _ {} +


답변

-베어 솔루션-

당신이 원하는 경우 find발견 된 디렉토리의 내용을 건너 뛸 수 있지만 다른 디렉토리에서 검색을 계속 사용은 -prune@laebshade 제안한다. 그러면 전체 명령은 다음과 같아야합니다

 find . -type d -name somename -prune -exec ...

당신이 원한다면 반면에, find완전히하는 검색을 중지 하고 일치하는 첫 번째 디렉토리를 찾은 후, 다음 당신을 위해 무엇을 찾고있는 것입니다 -quit(버전 이후 사용할 수 4.2.3GNU find). 이것은 find즉시 종료 하기 때문에 사용하기가 조금 까다로워서 -quit명령의 맨 끝에 배치해야합니다.

find . -type d -name somename -exec ... -quit

이것이 예상대로 작동하려면 -exec반환이 true (즉, 상태 가 0 )인지 확인해야합니다. 종료 상태를 -exec무시하여 -quit항상 작동하려면 약간의 트릭이 필요합니다.

find . -type d -name somename \( -exec ... -o -true \) -quit

또는

find . -type d -name somename \( -exec ... -o -quit \)

또는

find . -type d -name somename \( -exec ... , -quit \) # a comma before -quit

-몇 가지 설명-

find작동 방식 에 대한 가장 중요한 것은 모든 조치 ( “테스트”) 가 왼쪽에서 오른쪽으로 해석되는 논리 술어 로 취급 된다는 것입니다. 따라서 마지막 작업 (예 -quit:)은 전체 이전 부분이 false를 반환하지 않은 경우에만 수행됩니다 . 기본적으로 모든 테스트는 논리적 “AND”로 연결되며 -o옵션은 관절을 “OR”로 변경합니다.

의 까다로운 요소 -ofind할 수있는 “최적화”명령과 실행되지 -exec방금 입력하면 일부

find . -type d -name somename -exec ... -o -quit

이에 대처하기 위해, find괄호로 묶어 “OR”로 표시된 모든 술어를 강제 로 평가할 수 있습니다 .


답변