유사한 검색을 수행할 때 find 명령 뒤에 - 매개변수를 추가하면 find -type d
해당 매개변수가 없을 때보다 더 많은 결과가 검색됩니다.print0
find -print0 -type d
답변1
셸(그리고 C, C++ 및 파생 언어)에서 &&
and 연산자를 알고 있다면 그것을 알고 있는 것입니다.||
-a
-o
find
기억을 되살리세요:
껍질에서,
명령 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
이전에 평가된 논리 값(평가 시 -true
OR -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
-false
FALSE
FALSE
-false
-false -a -printf 'nope\n'
: 첫 번째 피연산자는 표현식이므로 아무 것도 수행되지 않으며 해당 값은 이므로FALSE
평가 가 단락되므로 전체 표현식이 값을 가지며 감소됩니다 . 다음 표현식/연산을 사용하여 평가될 표현식 공식 에 적용 됩니다.<expr1>
FALSE
<expr2>
FALSE
-false
-false -o -printf 'yep\n'
: 첫 번째 피연산자는 표현식이므로 아무 작업도 수행하지 않으며 해당 값은 이므로 평가FALSE
가 단락되지 않습니다.<expr1>
FALSE
printf '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 d
TRUE
FALSE
TRUE
FALSE
-type d