----------------긴 이야기를 짧게 ----------------

----------------긴 이야기를 짧게 ----------------

유사한 검색을 수행할 때 find 명령 뒤에 - 매개변수를 추가하면 find -type d해당 매개변수가 없을 때보다 더 많은 결과가 검색됩니다.print0find -print0 -type d

답변1

셸(그리고 C, C++ 및 파생 언어)에서 &&and 연산자를 알고 있다면 그것을 알고 있는 것입니다.||-a-ofind

기억을 되살리세요:

껍질에서,

명령 1  &&  명령 2

달리다command1, 그리고 만약 그렇다면 (command1) 성공적으로 (쉘)이 실행됩니다.command2.

명령 1  ||  명령 2

달리다command1, 그리고 만약 그렇다면 (command1) 실패하면 (셸)이 실행됩니다.command2.

컴파일 가능한 언어에서는

식 1  &&  식 2

평가하다expr1. 그 경우 (expr1)는 false(영)으로 평가되며 해당 값을 전체 표현식의 값으로 반환합니다. 그렇지 않으면 (만약expr1참(0이 아닌) 값으로 평가됨)expr2이를 전체 표현식의 값으로 반환합니다.

식 1  ||  식 2

평가하다expr1. 그 경우 (expr1)는 참(0이 아닌) 값으로 평가되며, 이는 전체 표현식의 값으로 반환됩니다. 그렇지 않으면 (만약expr1거짓(0)으로 평가됨)expr2이를 전체 표현식의 값으로 반환합니다.

    표현식의 전체 값을 결정하는 데 필요한 값을 갖는 항을 요구하지 않고 부울 표현식을 평가할 수 있기 때문에 이를 "단락 평가"라고 합니다.

에서 인용찾기(1),

GNU는 find우선 순위 규칙(연산자 섹션 참조)에 따라 왼쪽에서 오른쪽으로 주어진 표현식을 평가하고, 결과가 알려질 때까지(왼쪽은 false) 각 주어진 파일 이름에 루트가 있는 디렉터리 트리를 검색합니다.그리고작업에 적용 가능또는), find다음 파일 이름으로 이동합니다.
            ⋮

표현 방식

표현식은 테스트(참 또는 거짓 값을 반환)와 연산(부작용이 있고 참 또는 거짓 값을 반환)으로 구성되며 모두 연산자로 구분됩니다.  -그리고연산자가 생략되었다고 가정합니다.
                    ⋮
    이 섹션은 다음과 같습니다.행동지적-인쇄대부분의 작업 과 마찬가지로
    항상 참값이 반환됩니다.
                    ⋮

운영자

            ⋮
식 1 식 2
식 1-ㅏ식 2
식 1-그리고식 2    ····················· ························· ··························· ················POSIX 표준을 준수하지 않음
    그리고;식 2다음과 같은 경우 평가되지 않습니다.식 1가짜입니다.
식 1-영형식 2
식 1-또는식 2    ····················· ························· ··························· ················POSIX 표준을 준수하지 않음
    또는;식 2다음과 같은 경우 평가되지 않습니다.식 1그건 진실이야.

이것공개 그룹 사양find비슷한 말은 다음과 같습니다.

이것찾다유틸리티는 디렉토리 계층 구조를 반복적으로 내려와서 발견된 각 파일의 피연산자 섹션에 설명된 기본 요소로 구성된 부울 표현식을 평가해야 합니다.
            ⋮

피연산자

            ⋮
-인쇄
    기본은 항상 true로 평가되어야 하며 현재 경로 이름이 표준 출력에 기록됩니다.
            ⋮
기본 색상은 다음 연산자를 사용하여 결합할 수 있습니다(우선순위가 감소하는 순서대로):
            ⋮

표현하다 [-ㅏ] 표현하다
    기본 항목의 조합, AND 연산자는 두 기본 항목의 병치에 의해 암시적이거나 선택적으로 명시적입니다.-ㅏ운영자. 첫 번째 표현식이 false이면 두 번째 표현식을 평가하면 안 됩니다.
표현하다  -영형  표현하다
    기본 교대 또는 연산자. 첫 번째 표현식이 true이면 두 번째 표현식을 평가하면 안 됩니다.

두 문서 모두 다음과 같이 말합니다. “그렇지 않다면표현하다존재하다,-인쇄표현의 수단으로 사용되어야 합니다. "

----------------긴 이야기를 짧게 ----------------

그래서,

find -type d

동등하다

find -type d -print

이는 다음과 같습니다.

find -type d -a -print

의미는,

  • 각 파일에 대해
    • 평가 -type d시험.
    • true인 경우(즉, 현재 "파일"이 디렉터리인 경우) 작업 -print이 평가(실행)됩니다.

하지만,

find -print -type d

동등하다

find -print -a -type d

의미는,

  • 각 파일에 대해
    • -print작업 평가(실행)(즉, 이런 일이 발생합니다모든 파일에 대해).
    • true(항상 -print) 인 경우 -type d테스트가 평가됩니다.
    • 또한 명령의 끝이므로 테스트 결과는 -type d무시됩니다.

그래서 거기에 있습니다.

답변2

매개변수를 조회하는 순서가 중요합니다. 명령을 다음과 같이 빌드해야 find -type d -print0예상대로 작동합니다. 누군가에게 도움이 될까 해서 포스팅을 하려고 생각했어요.

답변3

명령을 이해하는 요령 find은 처음 두 표현식/액션을 재귀적으로 평가하고 이를 결과 논리값의 적절한 표현식( -true또는 -false)으로 그룹화하는 것입니다. 이때 각 표현식/액션 쌍의 평가는 단락됩니다(따라서 비교의 두 번째 피연산자에 대한 표현식/작업은 AND첫 번째 평가된 표현식이 )이고 FALSE비교된 표현식/작업인 경우 OR평가/평가 및 실행되지 않습니다. 두 번째 피연산자는 평가/평가 및 실행되지 않습니다.TRUE프로세스 중에 발생하는 각 작업은 항상 TRUE이전에 평가된 논리 값(평가 시 -trueOR -false표현식으로 축소됨)을 기반으로 합니다. 표현식/작업 쌍.

유용한 예제 확장협회1_CR 게시됨:

find . -false -o -false -a -printf 'nope\n' -o -printf 'yep\n' -o -printf 'nope\n'
yep
  • -false -o -false: 첫 번째 피연산자는 표현식이므로 아무 작업도 수행하지 않으며 해당 값 은 이므로 평가 FALSE가 단락되지 않으므로 전체 표현식이 값을 가지며 표현식 수식 으로 축소됩니다 . 다음 표현식/연산을 사용하여 평가됩니다.<expr1>FALSE-falseFALSEFALSE-false
  • -false -a -printf 'nope\n': 첫 번째 피연산자는 표현식이므로 아무 것도 수행되지 않으며 해당 값은 이므로 FALSE평가 가 단락되므로 전체 표현식이 값을 가지며 감소됩니다 . 다음 표현식/연산을 사용하여 평가될 표현식 공식 에 적용 됩니다.<expr1>FALSE<expr2>FALSE-false
  • -false -o -printf 'yep\n': 첫 번째 피연산자는 표현식이므로 아무 작업도 수행하지 않으며 해당 값은 이므로 평가 FALSE가 단락되지 않습니다.<expr1>FALSEprintf 'yep\n'지금 평가하고 실행하세요, 그 값은 TRUE이고 전체 표현식의 값은 이며 다음 표현식/연산을 사용하여 평가되는 표현식 TRUE으로 축소됩니다 .-true
  • -true -o -printf 'nope\n': 첫 번째 피연산자는 표현식이므로 아무 것도 수행되지 않으며 해당 값 은 이므로 평가가 TRUE단락 되므로 전체 표현식의 값은 입니다 .<expr1>TRUE<expr2>TRUE

동일한 작업을 수행하면 find [...] -print0 -type d다음과 같이 확장됩니다 find [...] -print0 -a -type d(누락된 연산자가 AND연산자로 확장되기 때문).

  • -print0 -a -type d: 첫 번째 피연산자는 액션이므로-print0지금 평가하고 실행하세요, 그 값은 입니다 TRUE. 평가는 단락되지 않습니다. 따라서 <expr1>평가 의 값은 또는 테스트 결과를 기반으로 합니다.TRUE-type dTRUEFALSETRUEFALSE-type d

관련 정보