그 안에 포함된 파일을 다시 조회할 수 있도록 특정 문자열이 있는 모든 디렉터리를 찾고 싶습니다.
./my-search-term/dir/my-search-term
그래서 나는 그런 일 에 시간을 낭비하고 싶지 않습니다 .
첫 번째 my-search-term 디렉토리를 찾을 때 재귀를 어떻게 중지합니까?
답변1
작업 -prune
은 find
디렉터리로 반복되지 않습니다. 예를 들어 다른 작업과 결합할 수 있습니다( -exec
어느 쪽이든 수행되는 한 순서는 중요하지 않습니다).-prune
-exec
-prune
find . -name my-search-term -prune -exec find {} … \;
find
a 내부에 중첩하는 것은 find -exec
약간 문제가 될 수 있습니다. 종결자는 external 에 의해 종결자로 처리되기 때문에 -exec
내부에서 사용할 수 없습니다 . 이 문제는 셸을 호출하여 해결할 수 있지만 인용할 때는 주의하세요.find
find
find . -name my-search-term -prune -exec sh -c '
find "$@" … -exec … {\} +
' _ {} +
답변2
- 네이키드 솔루션 -
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
반환이 보장되어야 합니다.진짜(즉,영상태). -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
마지막 작업은 이전 부분 전체가 반환되지 않은 경우에만 실행됩니다(예:)잘못된. 기본적으로 모든 테스트는 논리적 "AND"로 연결됩니다. 이 -o
옵션을 사용하면 연결이 "OR"로 변경됩니다.
한 가지 까다로운 요소 는 명령을 "최적화"할 수 있고 -o
입력만 하면 해당 부분을 실행하지 않을 수 있다는 것입니다.find
-exec
find . -type d -name somename -exec ... -o -quit
이 문제를 해결하려면 find
"OR"로 연결된 모든 조건자를 괄호로 묶어 강제로 평가할 수 있습니다.
답변3
이것이 당신이 찾고 있는 것인지 확실하지 않지만 "maxlength" 옵션은 find 명령이 현재 디렉토리를 벗어나는 것을 허용하지 않습니다. 또한 조회에 와일드카드를 추가할 수도 있다고 생각합니다.
$> find /your/dir -name '*mystring*' -maxdepth 1 -type d -exec my_action {} \;
-이름'내 문자열'일치하는 파일을 모두 찾습니다'내 문자열'. 작은따옴표에 주의하세요. -maxlength 1은 현재 디렉터리 내의 파일을 찾습니다. -maxlength 2는 현재 디렉터리와 다른 수준의 디렉터리 등에서 파일을 찾습니다. -type d는 디렉토리에 속한 파일을 찾습니다. -type f 일반 파일 등을 찾습니다.
내 0.02...^_^