정리 된 디렉토리가 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
는 Timo의 답변에 표시된 매뉴얼 페이지 섹션이 아니라 EXPRESSIONS
섹션 에 설명되어 있습니다.
식이 이외의 조치를 포함하지 않는 경우 -prune
,
-print
표현식이 true 인 모든 파일에 대해 수행된다.
이는 표현식이 aa
디렉토리 이름 과 일치하므로 표현식이 true로 평가되고 find -print
가 전체 명령의 끝에 암시 적으로 a 를 추가하기 때문에 표현식이 인쇄 됨을 의미합니다. -print
그러나 의도적으로 -o -print
끝 부분에 작업 을 추가하는 경우을 추가 하지 않습니다 .
find . -type d -name aa -prune -o -print
.
./file1
./bb
./bb/file3
여기서 find 명령은 -print
더 이상 암시 적을 추가하지 않으므로 정리하는 디렉토리 ( aa
)가 인쇄되지 않습니다.
마지막으로, 파일 이름 패턴이 file*
다음에 나오는 파일을 검색하는 절을 추가하면 -o
다음 -print
과 같이 두 번째 절의 끝에 를 넣어야합니다 .
find . \( -type d -name aa -prune \) -o \( -type f -name 'file*' -print \)
./file1
./bb/file3
이것이 작동하는 이유는 동일합니다. -print
두 번째 절에을 넣지 않으면 조치 이외의 -prune
조치 가 없으므로 find는 -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
사람 페이지가이 명령에 대한 네버 앤딩 전 세계적으로 혼란을 방지하기 위해 업데이트해야합니다.
-print
. 그렇지 않으면 암시 적으로-print
전체 조건에 적용됩니다.