find -not이 어떻게 작동하는지 이해하지 못합니다.
트리에서 모든 .git 디렉토리를 찾고 싶다고 가정해 보겠습니다.
find -type d -iname .git
문제 없습니다. 그러나 포함하고 싶지 않은 디렉토리가 있다고 가정해 보겠습니다. 문제가 있는 경우 해당 디렉토리를 "이전" 및 "백업"이라고 부를 수 있습니다.
grep -v로 파이프하면 제대로 작동합니다.
find -type d -iname .git | grep -v old | grep -v backup
그러나 find에 대한 매뉴얼 페이지를 탐색했을 때 -not이 있다는 것을 알았지만 그것이 어떻게 작동하는지 모르겠습니다.
나는 이것을 시도했지만 그는 오래된 디렉토리를 제외하지 않습니다.
find -type d -iname .git -not -iname old
find-not은 어떻게 작동하나요? 문제를 찾는 데 사용할 수 있나요?
답변1
find는 이 상황을 처리하기에는 좀 더 복잡합니다.
표현식에 이외의 작업이 포함되어 있지 않으면
-prune
표현식
따라서 원하는 부분을 명시적으로 인쇄하십시오.
find -type d \( -iname old -prune -o -iname backup -prune -o -iname .git -print \)
오래된 트리와 백업 트리를 모두 검색하지 마세요.
답변2
다음을 지정하여 디렉터리를 제외할 수 있습니다 -path
.
find . -type d \( -iname .git ! -path "*/old/*" ! -path "*/backup/*" \)
-not
GNU에서는 find
POSIX와 동일 하지만 !
호환되지는 않습니다.
인용 출처 man find
:
! expr True if expr is false. This character will also usually need
protection from interpretation by the shell.
-not expr
Same as ! expr, but not POSIX compliant.
답변3
-prune
선택 해야하는데 find
정말 까다롭습니다. -path
대신 too 를 사용해야 합니다 -name
.
나는 당신이 이것을 사용하고 싶다고 생각합니다 :
find . -type d \( -path '*/old' -prune -o -iname '.git' -print \)
효과 -not
는 통해
- old "old"와 일치하지만 donig에는 아무것도 없습니다.
- 또는 (-o 옵션 사용)
- ".git"을 일치시키고 이름을 인쇄하십시오.
- 또는 (기본값)
- 아무 것도 하지 않습니다(find의 일반적인 기본 동작(
-print
명령줄 끝에 암시적인 동작)이-print
사용되면 비활성화되기 때문입니다)
나는 다른 변형을 인식하지만보고 있다명령줄에서는 더 복잡하고 사용하기가 더 쉬울 것입니다. 예를 들어 다른 논리식을 사용하고 기본 작업을 변경하기 때문입니다.
반면에 -prune
다른 문법은 너무 길어서 읽을 수 없지만, 관련된 변형은 더 복잡한 경우에 더 쉽게 일반화됩니다.
답변4
find -type d -iname .git -not -iname old
이는 호출된 .git
디렉토리와 호출되지 않은 디렉토리와 일치합니다 old
. .git
호출된 디렉토리는 호출할 수 없으므로 이 old
부분 -not -iname old
은 명령의 의미를 바꾸지 않고 제거할 수 있다.
-not
"일치하지 않음"이라고 말하지만 "반복하지 않음"은 아닙니다. "재귀하지 마세요"라고 말하는 다른 방법이 있습니다. 이는 이라는 작업입니다 -prune
. 다음 명령은 "모든 디렉터리( find
)를 재귀적으로 탐색하지만 old
( )라는 -iname old -prune
디렉터리에서 중지하고 ( )라는 디렉터리를 인쇄합니다 .git
"를 의미합니다.
find -iname old -prune -o -type d -iname .git -print
이는 로 해석됩니다 . Find의 역할은 또는 ( ) ( -iname old -prune ) -o ( -type d -iname .git -print )
조건을 만족하는 파일을 찾는 것입니다 . 파일이 첫 번째 조건을 만족하면 작업을 수행합니다(순회된 트리에서 잘라내기, 즉 재귀적이지 않음). 파일이 두 번째 조건을 충족하면 작업이 수행됩니다 . 인쇄는 기본 동작이므로 생략할 수 있습니다 .-iname old
-o
-type d -iname .git
-prune
-print
-print