".git" 디렉토리를 찾았지만 일부 경로 또는 "find -not" 작동 방식을 무시합니다.

".git" 디렉토리를 찾았지만 일부 경로 또는 "find -not" 작동 방식을 무시합니다.

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표현식 -print이 true인 모든 파일이 실행됩니다.

따라서 원하는 부분을 명시적으로 인쇄하십시오.

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/*" \)

-notGNU에서는 findPOSIX와 동일 하지만 !호환되지는 않습니다.

인용 출처 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

관련 정보