find 명령에서 특정 디렉토리의 하위 디렉토리를 제외하는 방법은 무엇입니까?

Aug 15 2020

모든 파일 wc -l의 단어 수를 얻기 위해 파이프 할 wc수있는 파일 목록을 가져 오려고합니다 (명령을 사용하기 전에 파일 목록을 필터링 할 수 있도록 직접 사용하지 않음 ).

내 디렉토리 구조는 다음과 같습니다.

- folder
   - file.php
   - file2.html
   - file3.php
   - folder1
   - folder2a
   - folder3b
   - folder4
- file.php
- file2.php

find, 주로 라이브러리 및 내가 만들지 않은 기타 항목의 특정 디렉토리를 제외하고 싶습니다 . 이렇게 수동으로 할 수 있습니다.

find /var/www/html/ -type f -not -path "/var/www/html/folder/folder1" -not -path "/var/www/html/folder/folder2a" 기타

그러나 모든 폴더를 명시 적으로 지정해야하는 것은 성가신 일이며 목록은 언제든지 변경 될 수 있습니다. 나는 사용 /*하고 /**패턴 일치를 시도했지만 작동하지 않습니다. 나는 특정 디렉토리의 모든 서브 디렉토리를 제외 할 수 있음을 내 찾기 명령이 "없다"의 하나의 방법이 있지만, 아니 그 디렉토리 자체를 제외? (파일은 포함하지만 하위 디렉토리는 포함하지 않음)?

다음은 직관적 인 추측입니다.

find /var/www/html -not -path '/var/www/html/someotherbadfolder' -type f \( ! -path "/var/www/html/folder" -maxdepth 1 \)

그러나 이것에 find대해 불평 조차 합니다.

find: warning: you have specified the -maxdepth option after a non-option argument -not, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it).  Please specify options before other arguments.

그래서 그것은 maxdepth작업에서 결합 될 수없는 것 같습니다 .

특정 하위 디렉토리를 제외하는 것에 대한 많은 질문과 답변이 있지만 일반적으로 특정 하위 디렉토리의 하위 디렉토리는 아닙니다.

를 사용하여 단일 디렉토리에서 작동하도록 할 수 -maxdepth 1있었지만 문제는 이것이 더 큰 명령의 제외 부분이며 전체 명령을 실행 한 후에는 작동하지 않는다는 것입니다. 잠재적으로 특정 하위 디렉터리와 여러 다른 특정 하위 디렉터리의 하위 디렉터리를 제외해야 할 수도 있습니다.

답변

jeremysprofile Aug 16 2020 at 01:10

그냥 찾기 :

find /var/www/html -type f -not -path '/var/www/html/folder/*/*'

원래 답변 :

grep -vfind 결과에 한 가지 해킹이있을 수 있습니다 .

find /var/www/html/ -type f | grep -v "/var/www/html/folder/.*/" | wc -l
2 root Aug 16 2020 at 01:13

특별히 파일 (즉, 디렉토리가 아님)을 찾고 있다고 가정합니다.

find /var/www/html -type f -not -path "/var/www/html/folder/*/*"

그것은 ~ 때문에:

  • 바로 아래에 /var/www/html/folder있는 파일 은 디렉토리가 아니므로 -path절 과 일치하지 않습니다 .
  • 바로 아래의 디렉토리 /var/www/html/folder가 일치하지 않습니다 -type f.
  • 의 하위 디렉터리 아래에있는 파일 은 경로에 /var/www/html/folder추가 항목이 있어야 /하므로 -path표현식 과 일치합니다 .