내 GNU findutils(FSF 2015)는 다음과 같이 말합니다.
-prune
True;
if the file is a directory, do not descend into it.
If -depth is given, false; no effect.
Because -delete implies -depth, you cannot usefully use -prune and -delete together.
그리고 Posix:
-prune
The primary shall always evaluate as true;
it shall cause find not to descend the current pathname if it is a directory.
If the -depth primary is specified, the -prune primary shall have no effect.
개행 문자만 변경했습니다. 주목할 만한 두 가지 사항은 다음과 같습니다.
-prune
이것은 주연을 완전히 무시하는 것이 아닌가 ?즉, 왼쪽의 표현식을 "수집"하고 나머지는 -o
오른쪽의 표현식에 남겨 둡니다. 연결된 표현식인가요?
GNU의 매뉴얼 페이지를 보면 적어도 하나의 예를 볼 수 있습니다:
-name pattern
Base of ...
...
...
To ignore a directory and the files under it, use -prune;
see an example in the description of -path.
...
음, 여기에 간단한 예가 있습니다 find . EXPR -prune -o -print
. 이것은 자연스럽게 질문을 제기합니다. 왜 find .
아무것도 인쇄합니까?
뒤돌아보니 정리도 잘 되어있고 있을 건 다 있었어요.
지금 관련 질문:
-prune
이 두 가지 해석(GNU 대 POSIX)은 어떤 관련이 있습니까?
내 생각에는 posix가 지루한 기술 목록과 유용한 팁을 가져다가 아무 이유 없이 전문 용어로 바꾼 것처럼 보입니다. 이것은 심지어 오해의 소지가 있습니다.
궁극적으로 두 가지 설명 모두 다음과 같은 질문을 남기기 때문입니다.
After가 항상 true를 반환하는 경우 왜 -o
After가 필요합니까?-prune
다음은 테스트된 예입니다. 건너뛰고 싶은 마운트 지점이 있고 ramdisk "0"(영)도 건너뛰고 싶고 "test"가 포함된 모든 파일을 나열하고 싶습니다.
find . -xdev -name "0" -prune -o -name '*test*'
이와 같이 작동하며 ./0
실제로 매우 흥미로운 줄도 포함합니다.
prune-o-trick이 없으면 명시적 -print
.
답변1
-prune
이것은 주연을 완전히 무시하는 것이 아닌가 ?즉, 왼쪽의 표현식을 "수집"하고 나머지는-o
오른쪽의 표현식에 남겨 둡니다. 연결된 표현식인가요?
아니요, 그들은 그것을 무시하지 않습니다. 왜냐하면 그것은 s의 영향이 전혀 아니지만 s 연산자 우선 순위의 결과이기 때문입니다 -prune
.find
find . EXPR -prune -o -print
동등하다
find . \( EXPR -prune \) -o -print
-prune
EXPR
사실인지 평가합니다. EXPR
false 이면 -prune
평가되지 않고 복합 표현식은 false로 평가됩니다. EXPR
true 이면 -prune
항상 true이므로 복합 표현식이 true로 평가됩니다. 이 모든 것의 결과는 무엇이든지 -print
false인 경우에만 평가 된다는 것입니다 .EXPR
-prune
find . -xdev -name "0" -prune -o -name '*test*'
다음 규칙에 따라 인쇄 ./0
및 다양한 일치 항목이 표시됩니다(맨페이지 인용).*test*
전체 표현식에
-prune
또는 이외의 연산이 포함되어 있지
On 에서는 0
true -name "0" -prune
로 평가되어 인쇄됩니다.
이 규칙은 이러한 동작이 발생하는 이유도 설명합니다 find .
.
GNU와 POSIX 해석은 동일합니다.
- "true; "match" 기본은 항상 true로 평가되어야 합니다."
- "파일이 디렉토리이면 해당 파일로 들어가지 마십시오."는 "디렉토리인 경우 find가 현재 경로 이름에서 내려오지 않게 됩니다."와 일치합니다.
- "-deep이 지정되면 -prune은 효과가 없습니다."는 "-length masternode가 지정되면 -prune masternode가 효과가 없습니다."와 일치합니다.
(인용하다개정된 find
문서).
-prune
반드시 따를 필요는 없으며 -o
이를 설명하는 몇 가지 예가 있습니다.POSIX 문서find
. 이 트릭은 find
현재 디렉터리의 즉각적인 내용을 제한하는 데 특히 유용합니다.
find . ! -name . -prune -print