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
다른 파일 시스템의 디렉터리를 내려가지 마세요.-xdev
find의 다른 버전과의 호환성을 위한 대체 이름입니다 .
그래서:
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