.git
검색 에서 제외 해야 합니다 find
. 이를 달성하기 위해 스위치를 사용했습니다 -path ./.git -prune
.
$ find . -path ./.git -prune -o \( -type f -o -type l -o -type d \) | grep '.git'
./.git
그러나 이는 .git 디렉터리의 내용을 건너뛰더라도 디렉터리 자체를 나열합니다. 추가하면 작동합니다-path ./.git -prune -o -print -a
find . -path ./.git -prune -o -print -a \( -type f -o -type l -o -type d \) | grep '.git'
이것이 왜 필요한가? 두 명령 모두 동일한 출력을 가져야 한다고 생각합니다. 두 번째 구문은 매우 보기 흉합니다.
답변1
find
명령이 정리된 디렉터리도 인쇄하는 이유 와 작동 방식에 대한 기타 복잡한 세부 사항이 혼란스러웠지만 -prune
몇 가지 예를 통해 알아낼 수 있었습니다.
아래 예제를 실행하려면 다음 디렉터리와 파일을 만듭니다.
mkdir aa
mkdir bb
touch file1
touch aa/file1
touch bb/file3
이 구조를 생성하려면:
$ tree
.
├── aa
│ └── file1
├── bb
│ └── file3
└── file1
이제 find를 사용하여 이름이 지정된 디렉토리를 찾으십시오 aa
. 여기에는 문제가 없습니다.
$ find . -type d -name aa
./aa
aa를 제외한 모든 디렉토리를 찾으면 현재 디렉토리를 얻습니다..
그리고 ./bb
그것도 말이 됩니다.
$ find . -type d ! -name aa
.
./bb
지금까지는 괜찮았지만 -prune
find 를 사용하면 정리 중인 디렉터리가 반환됩니다. 처음에는 정리 중인 디렉터리가 아닌 다른 모든 디렉터리를 반환할 것으로 예상했기 때문에 혼란스러웠습니다.
$ find . -type d -name aa -prune
./aa
-prune
매뉴얼 페이지 섹션에 명시하는 대신 정리된 디렉토리를 반환하는 이유를 설명했습니다.티모의 대답, 하지만 이 EXPRESSIONS
섹션에서는 다음과 같습니다.
표현식에 이외의 작업이 포함되어 있지 않으면
-prune
표현식
이는 표현식이 디렉토리 이름과 일치하므로 find가 암시적으로 전체 명령 끝에 a를 추가하기 aa
때문에 표현식이 true로 평가되고 인쇄된다는 것을 의미합니다. 그러나 의도적으로 작업을 끝에 직접 추가하면 다음이 추가되지 않습니다.-print
-print
-o -print
find . -type d -name aa -prune -o -print
.
./file1
./bb
./bb/file3
여기서 find 명령은 더 이상 암시적 항목을 추가하지 않으므로 -print
pruning() 중인 디렉토리는 aa
인쇄되지 않습니다.
file*
따라서 마지막으로 파일 이름 패턴 이 있는 파일을 검색하는 절을 추가하는 경우 다음과 같이 두 번째 절 끝에 절을 추가 -o
해야 합니다 .-print
find . \( -type d -name aa -prune \) -o \( -type f -name 'file*' -print \)
./file1
./bb/file3
-print
동일한 방식으로 작동합니다. 두 번째 절에 a를 넣지 않으면 find는 명령 끝에 자동으로 a를 추가합니다. 왜냐하면 -prune
that 외에는 아무것도 수행하지 않기 때문입니다. 절에서 정리된 디렉터리를 인쇄하게 됩니다.-print
-prune
find . \( \( -type d -name aa -prune \) -o \( -type f -name 'file*' \) \) -print
./aa
./file1
./bb/file3
-print
일반적으로 말하면 두 번째 절에 명령을 넣어야 합니다 . 원본 포스터처럼 중간에 넣으면 잘리는 파일이 즉시 인쇄되고 두 번째 절에서 원하는 파일을 선택할 기회가 없기 때문에 작동하지 않습니다.
find . \( -type d -name aa -prune -o -print \) -o \( -type f -name 'file*' \)
.
./file1
./bb
./bb/file3
안타깝게도 원본 포스터에서는 위 명령을 -print
잘못된 위치에 배치하여 오류가 발생했습니다. 그것은 그의 특별한 상황에 적용될 수 있지만 일반적인 경우에는 적용되지 않습니다.
-prune
그것이 어떻게 작동하는지 이해하는 데 어려움을 겪는 수천 명의 사람들이 있습니다 . find
이 명령에 대한 전 세계적인 혼란을 방지하려면 매뉴얼 페이지를 업데이트해야 합니다 .
답변2
페이지는 다음 man
을 제공합니다 find
.
-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.
따라서 첫 번째 예에서는 그렇지 않으므로 -path ./.git -prune
기본 동작( )이 호출되지 않아 -print
해당 행이 인쇄됩니다.
답변3
man
페이지 에서 ,
전체 디렉토리 트리를 무시하려면 트리의 모든 파일을 확인하는 대신 -prune을 사용하십시오. 예를 들어, "src/emacs" 디렉터리와 그 아래의 모든 파일 및 디렉터리를 건너뛰고 발견된 다른 파일의 이름을 인쇄하려면 다음을 수행하십시오.
find . -path ./src/emacs -prune -o -print
따라서 다음을 사용할 수 있습니다.
find . -path ./.git -prune -o -print
.git
디렉토리는 나열되지 않습니다 .
파일 이름을 지정하려면 다음을 수행하십시오.
find . -path ./.git -prune , -name filename
,
쉼표 연산자를 참고하세요 .
답변4
명령에서 특정 경로를 무시하는 가장 좋은 방법은 find
아래 설명된 대로 명령의 제외 옵션과 함께 사용하는 것입니다. /var/www/html에 폴더가 있습니다. 여기에 있는 London 및 Tokyo 폴더는 제외되어 나머지 폴더의 모든 파일을 나열합니다.find
ls
mumbai, dubai,tokyo, delhi, london, rome
ls /var/www/html |grep -v 'london\|tokyo' #ls exclude example is mentioned here.
다음과 같이 제외 힌트를 찾으세요:-
find $(ls /var/www/html |grep -v 'london\|tokyo' ) -type f #run above exclude option with find command as mentioned here.