포함 된 파일에서 다른 찾기를 수행 할 수 있도록 특정 문자열이있는 모든 디렉토리를 찾고 싶습니다.
그래서 나는 시간을 낭비하고 싶지 않습니다 ./my-search-term/dir/my-search-term
.
첫 번째 검색어 디렉토리를 찾았을 때 어떻게 되풀이를 멈출 수 있습니까?
포함 된 파일에서 다른 찾기를 수행 할 수 있도록 특정 문자열이있는 모든 디렉토리를 찾고 싶습니다.
그래서 나는 시간을 낭비하고 싶지 않습니다 ./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 … {\} +
' _ {} +
-prune
반환 하고 앞에 올 수 있습니다 . -exec
-o
거기에 있는 습관 , 나는 추측한다. 그리고 나는 -prune
앞에 두는 -exec
것이 더 읽기 쉽다고 생각 합니다.
-prune
전에 옵션을 사용하지 않았습니다 .
mkdir -p x1 x2; touch x1/x11 x1/x12 x2/x21 x2/x22; find . -name 'x1*' -exec rm -rf {} \;
은 오류를 제공합니다 find: ./x1: No such file or directory
. 해결책은 명령 -prune
끝에 추가 하는 것입니다 find
.
find
확장 버전은 {}
에 대한 인수의 하위 문자열로 나타날 때도 확장 됩니다 -exec
. 내부 명령 (쉘 명령)이 outer에있는 디렉토리 이름으로 대체 find
되기 때문에 이러한 버전은 두 번째 명령에서 질식합니다 . 즉, 쉘을 사용하여을 사용하여 문제를 해결할 수 있습니다 . … (계속){}
find
find
find . -name my-search-term -prune -exec sh -c 'find "$0" … -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"로 표시된 모든 술어를 강제 로 평가할 수 있습니다 .