find 및 -prune, GNU 및 POSIX 해석

find 및 -prune, GNU 및 POSIX 해석

내 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를 반환하는 경우 왜 -oAfter가 필요합니까?-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

-pruneEXPR사실인지 평가합니다. EXPRfalse 이면 -prune평가되지 않고 복합 표현식은 false로 평가됩니다. EXPRtrue 이면 -prune항상 true이므로 복합 표현식이 true로 평가됩니다. 이 모든 것의 결과는 무엇이든지 -printfalse인 경우에만 평가 된다는 것입니다 .EXPR-prune

find . -xdev -name "0" -prune -o -name '*test*'

다음 규칙에 따라 인쇄 ./0및 다양한 일치 항목이 표시됩니다(맨페이지 인용).*test*

전체 표현식에 -prune또는 이외의 연산이 포함되어 있지 -print않으면 -print전체 표현식이 true인 모든 파일이 실행됩니다.

On 에서는 0true -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

관련 정보