포함 된 파일에서 다른 찾기를 수행 할 수 있도록 특정 문자열이있는 모든 디렉토리를 찾고 싶습니다.
그래서 나는 시간을 낭비하고 싶지 않습니다 ./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에 의해 터미네이터로 표시되므로 -exec
inner에서 사용할 수 없습니다 . 쉘을 호출하여 따옴표를주의하여 해결할 수 있습니다.find
find
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.3
의 GNU 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”로 변경합니다.
의 까다로운 요소 -o
즉 find
할 수있는 “최적화”명령과 실행되지 -exec
방금 입력하면 일부
find . -type d -name somename -exec ... -o -quit
이에 대처하기 위해, find
괄호로 묶어 “OR”로 표시된 모든 술어를 강제 로 평가할 수 있습니다 .