"find"가 "stat" 또는 "fstat"와 왜 그렇게 많이 비슷합니까?

"find"가 "stat" 또는 "fstat"와 왜 그렇게 많이 비슷합니까?

/usr/bin/find아무것도 하지 않고 의미 있는 것을 보여주려고 노력 중인데 stat, 아직까지는 유용한 결과가 나오지 않았습니다. 강제로 억제하면 statfind가 하위 디렉토리로 전혀 내려가지 않습니다.

시스템 호출 매뉴얼 페이지에 나와 있듯이 거기에는 필드가 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 변경 사항을 생각해 낼 수 있습니다.

@nateldedge누군가를 알아차렸다여기 간다이 방향으로. 설명서 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모든 시나리오에 적용하기 보다는 번거롭고 시간이 걸리기 때문입니다.find

관련 정보