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


24

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

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

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


3
-prune으로 찾기를 시도 했습니까? 매뉴얼 페이지에서 : "파일이 디렉토리 인 경우 디렉토리로 내려 가지 마십시오. -depth가 제공되면 false입니다. 효과가 없습니다. -delete는 -depth를 암시하므로 -prune과 -delete를 함께 유용하게 사용할 수 없습니다."
laebshade

1
@ laebshade 왜 대답에 넣지 않습니까?
jw013

@ jw013 나는 그 당시에 더 깊이있는 대답을 할 시간이 없었습니다.
laebshade

답변:


17

-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 … {\} +
' _ {} +

첫 번째 명령의 괄호가 필요합니까? true를-prune 반환 하고 앞에 올 수 있습니다 . -exec
rozcietrzewiacz 1

아니요. 필요하지 않습니다. -o거기에 있는 습관 , 나는 추측한다. 그리고 나는 -prune앞에 두는 -exec것이 더 읽기 쉽다고 생각 합니다.
Gilles 'SO- 악마 그만해

고마워, -prune전에 옵션을 사용하지 않았습니다 .
haridsv

내 유스 케이스 에서이 명령 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.
haridsv

(1) 일부 find확장 버전은 {}에 대한 인수의 하위 문자열로 나타날 때도 확장 됩니다 -exec. 내부 명령 (쉘 명령)이 outer에있는 디렉토리 이름으로 대체 find되기 때문에 이러한 버전은 두 번째 명령에서 질식합니다 .  즉, 쉘을 사용하여을 사용하여 문제를 해결할 수 있습니다 . … (계속){}findfindfind . -name my-search-term -prune -exec sh -c 'find "$0" … -exec … "{"} +' {} \;"{"}{}
Scott

6

-베어 솔루션-

당신이 원하는 경우 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"로 표시된 모든 술어를 강제 로 평가할 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.