왜 `find`는 `stat`이나 `fstat`를 그렇게 좋아합니까?

왜 `find`는 `stat`이나 `fstat`를 그렇게 좋아합니까?

나는 /usr/bin/find어떤 종류의 작업도 하지 않고 stat, 아직까지 유용한 결과가 없이 의미 있는 것을 보여주려고 노력하고 있습니다. 강제로 금지하면 statfind가 하위 디렉터리로 내려가는 것을 전혀 중지합니다.

syscall 의 매뉴얼 페이지에 따르면 거기에는 필드 getdents가 있으므로 결정에 필요한 일부 정보가 이미 있어야 합니다.d_typefind

또는 어떤 옵션 에 stat관계없이 왜 필요합니까 ?-L-H

답변1

출처를 사용하세요, 루크!

GNU find소스(버전 4.2.2를 보고 있습니다)에서 디렉토리 트리를 순회하는 코드는 gnulib/lib/fts.c. 1123행에는 다음과 같은 주석이 있습니다.

fts_read가 이 항목과 어떤 관계가 있는지 기록하십시오. 대부분의 경우 단순히 fts_stat이지만 d_type 정보를 활용하여 불필요한 stat 호출을 최적화할 수 있습니다. 즉, FTS_NOSTAT가 적용되고 우리가 심볼릭 링크(FTS_PHYSICAL)를 따르지 않고 d_type이 이를 나타내는 경우~ 아니다디렉토리가 있으면 이를 전혀 언급할 필요가 없습니다. 그 경우~이다디렉토리가 있는 경우 (현재) 장치 및 inode 번호를 얻기 위해 이를 통계로 지정합니다. 언젠가는 d_ino가 유효한 것으로 알려진 디렉토리에 대해서도 이를 최적화할 수도 있습니다.

그래서 그들은 당신이 설명하는 최적화를 생각했지만 구현되지 않았습니다.

답변2

인용된 매뉴얼 페이지겟덴트Linux에만 해당되며 모든 파일 시스템 유형에 적용되지는 않습니다(예를 들어 매뉴얼 페이지에는procfs또는nfs), 반면 GNU찾다플랫폼별로 다르지 않습니다(매뉴얼 페이지에는 고려해야 할 유용한 기능인 SELinux가 언급되어 있습니다). 그것~할 수 있었다이 특별한 경우에도 최적화됩니다.

해당 기능을 사용할 수 있더라도 매뉴얼 페이지에서는 다음을 권장합니다.

모든 애플리케이션은 반환을 적절하게 처리해야 합니다.DT_UNKNOWN.

즉, 정보가 있으면 유용할 수 있지만 존재한다는 보장은 없습니다.

이러한 모든 단점에도 불구하고 의 개발자는 find이 최적화의 필요성을 인식하지 못할 수도 있습니다. 의욕이 있는 사용자는 소스 코드를 조사하여 이를 수행하는 방법을 확인하고 적절한 ifdef'd 변경을 제안할 수 있습니다.

@네이트 엘드리지누군가가 메모시작했다이 방향으로. 설명서 find에는 다음과 같은 내용이 나와 있습니다.7.2 d_type 최적화

이 기능이 활성화되면 find는 일부 시스템에서 readdir이 struct dirent의 파일 유형을 반환한다는 사실을 활용합니다.

그 특징은처음 언급됨~에

2005-01-17  James Youngman  <[email protected]>
    * configure.in, find/defs.h, find/find.c, find/parser.c, find/pred.c, find/tree.c, find/util.c:
    Implemented d_type optimisation but not working correctly, so currently disabled

나중에는 그랬다.gnulib을 사용하도록 개정됨이를 지원하기 위해:

2010-04-08  James Youngman  <[email protected]>

    Adopt the use of the gnulib module d-type.
    * import-gnulib.config (modules): Import the d-type module.
    * configure.ac: Remove old struct dirent.d_type detection logic
    (since we now use the gnulib macro from the d-type module for
    this).

그런데 버전 4.2.2는 다소 오래되었습니다(아마도 오타일 수 있음).4.2.3날짜는 2004년이며 이러한 변경 로그 항목 이전입니다. git의 현재 릴리스 태그는 다음과 같습니다.4.5.14(2014년 중반).

최적화 상태에 관계없이 d_type개발자는 에 대한 호출 수를 줄이는 데 관심이 있습니다 stat. 메모4.5.4(2009-03-10)은 예를 들어 다음과 같이 말합니다.

ftsfind 실행 파일은 이제 디렉토리에서 이미 이 정보를 읽은 경우 파일의 inode 번호를 검색하기 위해 stat() 함수 호출을 방지합니다. 이는 속도 향상을 제공하지만 "find . -inum 4001"과 같은 제한된 명령 세트에만 해당됩니다. 이 수정 사항은 아래에 버그 #24342로 나열되어 있습니다.

요약하면 OP가 질문했습니다.

-L, -H 또는 기타 옵션에 관계없이 stat가 필요한 이유는 무엇입니까?

stat그 이유는 이것이 필요할 수 있는 모든 시나리오 가 아닌 원활하게 작동하도록 만드는 것이 번거롭고 find이를 수행하는 데 시간이 걸리는 특수한 경우이기 때문입니다 .

관련 정보