일부를 포함하고 제외하여 다른 디렉토리에서 파일 찾기

일부를 포함하고 제외하여 다른 디렉토리에서 파일 찾기

특정 파일이 포함되거나 제외된 세 개의 다른 폴더에서 파일을 찾고 싶습니다.
폴더 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중단되지 않습니다 . 하위 트리를 제외하려면 .findfile1.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 …휴대용은 아닙니다.

관련 정보