찾기에서 디렉토리 제외

찾기에서 디렉토리 제외

find내가 그것을 사용할 때마다 항상 나에게 완전한 미스터리입니다. 나는 /mnt검색에서 (WSL의 Ubuntu 20.04에서 bash에 있으므로 Windows 공간에서 검색하고 싶지 않음) 아래의 모든 것을 제외하고 싶지만 find나를 완전히 무시하고 해당 디렉토리에 실수를 범합니다. 이 페이지에서 구문을 찾았습니다.https://stackoverflow.com/questions/4210042/how-to-exclude-a-directory-in-find-command모든 변형을 시도했지만 모두 실패했습니다.

sudo find / -name 'git-credential-manager*' -not -path '/mnt/*'
sudo find / -name 'git-credential-manager*' ! -path '/mnt/*'
sudo find / -name 'git-credential-manager*' ! -path '*/mnt/*'

이렇게 하면 오류가 발생 /mnt하고 오류가 발생합니다(위 구문은 명확해 보이고 스택오버플로 페이지 구문은 올바른 것처럼 보이기 때문에 정말 실망스럽습니다).

find: ‘/mnt/d/$RECYCLE.BIN/New folder’: Permission denied
find: ‘/mnt/d/$RECYCLE.BIN/S-1-5-18’: Permission denied

find누군가 내 디렉터리 제외 스위치 무시를 중지하는 방법을 보여줄 수 있습니까 ?

답변1

Find's는 -path경로를 제외하지 않습니다. 이는 "이름이 이 경로와 일치하는 항목을 보고하지 않음"을 의미합니다. 여전히 디렉토리로 내려가서 검색합니다. 당신이 원하는 것은 -prune(에서 man find):

       -prune True;  if  the file is a directory, do not descend into it.  If
              -depth is given, then -prune has no  effect.   Because  -delete
              implies  -depth, you cannot usefully use -prune and -delete to‐
              gether.  For example, to skip the directory src/emacs  and  all
              files  and  directories  under  it,  and print the names of the
              other files found, do something like this:
                  find . -path ./src/emacs -prune -o -print

따라서 원하는 것은 다음과 같습니다.

sudo find / -path '/mnt/*' -prune -name 'git-credential-manager*' 

제외하려는 대상에 따라 -mount(GNU find) 또는 -xdev(기타)을 사용하는 것이 더 쉬울 수도 있습니다.

에서 man find:

-mount다른 파일 시스템의 디렉터리를 내려가지 마세요. -xdevfind의 다른 버전과의 호환성을 위한 대체 이름입니다 .

그래서:

sudo find / -mount -name 'git-credential-manager*' 

답변2

옵션을 무시하지 않습니다. 조건 -path자는 발견된 모든 파일에 대해 평가되며 해당 트리의 파일에 대해서는 실패합니다. 이는 디렉토리 트리를 탐색하는 방법에 영향을 주지 않으며 외부의 모든 항목과 일치하는 것과 find같은 것을 가질 수 있지만 그 안에 일치하는 파일도 있을 수 있습니다 .find . ! -path "./foo/*" -o -name '*.txt'foo*.txt

그만큼GNU 매뉴얼 페이지여기서 무엇을 해야할지 명확합니다 -prune. 대신 다음을 사용하십시오.

-path pattern
... 전체 디렉토리 트리를 무시하려면 -prune트리의 모든 파일을 확인하는 대신 사용하십시오. 예를 들어 디렉터리 src/emacs와 그 아래의 모든 파일 및 디렉터리를 건너뛰고 발견된 다른 파일의 이름을 인쇄하려면 다음과 같이 하십시오.

find . -path ./src/emacs -prune -o -print

관련 정보