
특정 파일이 포함되거나 제외된 세 개의 다른 폴더에서 파일을 찾고 싶습니다.
폴더 1:
- 경로: /var/www/app/var/log/
- 제외: file1.log 및 file2.log
폴더 2:
- 경로: /var/log/web/log/
- 포함 항목: error.log
폴더 3:
- 경로: /var/log/service/log/
- 다음만 포함: app1.error.log 및 app2.error.log
이 경우 세 개의 서로 다른 폴더에서 파일을 어떻게 검색합니까?
답변1
로 이 작업을 수행할 수 있습니다 find
. find
제외 및 포함과 관련된 일반적인 사용법을 읽어보세요 .제외 및 포함이 포함된 파일을 반복적으로 검색합니다..
문제에는 세 가지 경로와 각각에 대한 서로 다른 요구 사항이 포함됩니다. 단일 호출에서 많은 시작점을 지정 find
하고 표현식(예: 사용 -path
)을 작성하여 다양한 경로에 대해 다양한 테스트를 수행할 수 있습니다. 가능하지만 오히려 번거롭습니다. 간단한 방법은 세 개의 개별 find 명령을 순서대로 실행하는 것입니다.
find /var/www/app/var/log ! -name file1.log ! -name file2.log
find /var/log/web/log -name error.log
find /var/log/service/log -name app1.error.log -o -name app2.error.log
노트:
위 명령의 여러 공백은 구조와 유사성을 강조하기 위한 것입니다.
"파일을 찾고 싶어요"라고 말합니다. 위의 명령은 찾을 것입니다파일유형 디렉토리의 파일을 포함합니다. 특히 첫 번째 명령은 자체 시작점(
…/log
)을 찾습니다. 일반 파일을 찾으려면-type f
. 디렉터리가 아닌 항목을 찾으려면! -type d
.file1.log
또는 가 디렉토리 유형인 경우app1.error.log
"포함" 또는 "제외"가 디렉토리만 가리키는지 아니면 아래의 모든 디렉토리와 모든 것을 가리키는지 확실하지 않습니다. 이는file1.log
설정에 있는 일반 파일일 가능성이 높기 때문에 문제가 되지 않을 것입니다 .참고로 위의 각 명령은 시작점 아래의 전체 디렉터리 트리를 탐색합니다. 예를 들어
file1.log
디렉토리 유형인 경우 테스트가! -name file1.log
중단되지 않습니다 . 하위 트리를 제외하려면 .find
file1.log/foo
-prune
find
재귀적으로 작동합니다. GNU가find
하위 디렉터리로 내려가지 않도록 만드는 가장 간단한 방법 은-maxdepth 1
. GNU가 아닌 구현에서는 이를 지원하지 않을 수 있습니다. 순수 POSIX 사용find
그렇게 간단하지 않아.태그하셨습니다.우분투; Ubuntu는
find
즉시 사용 가능한 GNU를 제공하므로-maxdepth 1
자유롭게 사용할 수 있습니다.올바른 사용법
-o
당신이 원하는만큼 간단하지 않습니다.관련 기호 링크가 있는 경우 의
-H
및-L
옵션을 읽어보세요man 1 find
. 그 중 하나를 사용하고 싶을 수도 있습니다.
이 모든 것을 염두에 두고 다음과 같은 세 번째 명령의 변형 예제를 만들 수 있습니다.아마도귀하의 요구 사항에 더 잘 맞습니다.
find /var/log/service/log/ -maxdepth 1 -type f \( -name app1.error.log -o -name app2.error.log \)
또는 POSIX 방식으로(일반 청중에게 답변을 더 유용하게 만들기 위해):
find /var/log/service/log/. \( -name . -o -prune \) -type f \( -name app1.error.log -o -name app2.error.log \)
후자의 명령 끝에서 시작점의 마지막 구성 요소는 입니다 .
. 이를 통해 일반적인 솔루션을 사용할 수 있습니다(즉, 양식이 -name . -o -prune
시작점 경로의 실제로 의미 있는 부분에 의존하지 않는다는 의미입니다). 반면에 모든 경로 이름에 find
포함되므로 /.
이를 원하지 않을 수도 있습니다.
find
하나 대신 세 개를 실행해도 결과를 단일 대상(예 xargs
: )으로 파이프할 수 있습니다.
{ find … ; find … ; find … ; } | xargs …
우분투에서는 할 수 있습니다 find … -print0 | xargs -r0 …
. 이것은더욱 견고해졌습니다하지만 find … -print | xargs …
휴대용은 아닙니다.