리눅스에서는,
cd /tmp
mkdir foo; cd foo
이제 실행
find . -name 'foo'
출력이 없습니다. 달리는 동안
find /tmp/foo -name 'foo'
주어진 출력은 /tmp/foo
나에게 이해가 되지 않습니다. 누군가 이유를 설명할 수 있나요?
답변1
find
지정된 디렉터리 트리를 탐색하고 발견된 각 파일에 대해 지정된 표현식을 평가합니다. 순회는 지정된 경로에서 시작됩니다. 작동 방식을 요약하면 다음과 같습니다 find . -name foo
.
- 명령줄의 첫 번째 경로:
.
- basename(
.
)이 패턴과 일치합니까foo
? 아니, 그러니 아무것도 하지 마세요.
이것은/tmp/foo
동일한 디렉토리의 또 다른 이름입니다. 하지만find
그것을 모릅니다(알려고 노력해서도 안 됩니다). - 경로가 디렉터리인가요? 네, 반복해서 살펴보세요. 목록의 항목을 열거
.
하고 각 항목에 대해 반복 프로세스를 수행합니다.- 디렉토리는 비어 있습니다. 및 및
.
이외의 항목은 포함되어 있지 않으며 재귀적으로 탐색되지 않습니다. 그리고 작업이 완료되었습니다...
find
- 디렉토리는 비어 있습니다. 및 및
- basename(
그리고 find /tmp/foo
:
- 명령줄의 첫 번째 경로:
/tmp/foo
- basename(
foo
)이 패턴과 일치합니까foo
? 네, 조건이 충족되었습니다.- 이 조건과 연관된 작업이 없으므로 경로를 인쇄하는 기본 작업이 수행됩니다.
- 경로가 디렉터리인가요? 네, 반복해서 살펴보세요. 목록의 항목을 열거
/tmp/foo
하고 각 항목에 대해 반복 프로세스를 수행합니다.- 디렉토리는 비어 있습니다. 및 및
.
이외의 항목은 포함되어 있지 않으며 재귀적으로 탐색되지 않습니다. 그리고 작업이 완료되었습니다...
find
- 디렉토리는 비어 있습니다. 및 및
- basename(
.
와 은 /tmp/foo
동일한 디렉터리이지만 find
동일한 동작을 보장하기에는 충분하지 않습니다. 이 find
명령에는 동일한 파일에 대한 경로를 구별하는 방법이 있으며 -name
그 중 하나가 술어입니다. find /tmp/foo -name foo
시작 디렉터리 및 그 아래에 명명된 모든 항목과 일치합니다 foo
. find . -name .
시작 디렉터리만 일치합니다( .
재귀 순회 중에는 찾을 수 없음).
답변2
테스트가 적용되기 전에는 명령줄 매개변수가 표준화되지 않습니다. 따라서 결과는 사용된 경로에 따라 달라집니다(심볼릭 링크가 포함된 경우).
cd /tmp
mkdir foo
ln -s foo bar
find /tmp/foo -name foo
find /tmp/bar -name foo
"귀하의 경우"에서는 두 호출 모두 동일한 결과를 제공하므로 (더) 혼란스러울 수 있습니다. -mindepth 1
시작점(POSIX가 아닐 수도 있음)을 무시하려는 경우에 사용할 수 있습니다.
답변3
(gnu) find는 명령줄 인수에 대한 비교를 시작하고 거기에서 디렉터리 구조로 드릴다운할 때 명령에 제공된 경로에서 찾은 일치 항목을 표시합니다(따라서 -maxdepth 0
테스트를 기본 수준이나 명령줄 인수로만 제한하는 반면, 설명된 -mindepth 1
대로 명령줄 인수를 건너뜁니다 man find
. 이것이 find /tmp/foo -name 'foo'
디렉터리 자체가 비어 있어도 일치 결과가 나오는 이유입니다.
find . -name 'foo'
반면에 .
(dot)은 동일한 inode에 대한 하드 링크처럼 작동하는 특수 파일이기 때문에 아무 것도 생성되지 않습니다 /tmp/foo
. 이는 기호 링크나 제한된 표현식 셸의 경로 이름 확장이 아닌 별도의(특수하지만) 파일 이름과 같습니다. 따라서 주어진 예에서 명령줄 인수에 find를 통해 적용된 첫 번째 테스트에서는 .
실제로 에 정의된 이름 패턴과 일치하는 항목이 없기 때문에 일치하는 항목이 표시되지 않습니다 -name 'foo'
. /tmp/foo/.
패턴 테스트는 -name
경로의 기본 이름에 대해서만 수행되므로(참고자료 man find
참조), 그렇게 되지도 않습니다 .
.
이 동작은 사용자 관점에서 예상되거나 직관적이지 않을 수 있지만(예, 처음에는 저도 혼란스러웠습니다), 이는 버그를 구성하지 않지만 매뉴얼 및 정보 페이지에 설명된 내용과 일치합니다. 논리적 및 기능적 대응(gnu) 조회.
답변4
foo
상대 검색을 시작한 디렉터리에 지정된 개체가 없습니다.
시작 디렉터리로 절대 이름을 사용할 때 보고할 때 gfind
문제가 있다는 가정이 맞습니다 ./tmp/foo
Gfind
표준과의 모든 편차로 인해 다른 표준을 찾은 것처럼 보입니다. sfind
이것을 로 추천합니다 schilytools
.
-name
디렉터리 검색 결과에 적용됩니다. 언급한 두 가지 경우 모두 작업 foo
에서 디렉터리 항목을 반환하지 않습니다.readdir()