GNU Find가 그래픽 파일 검색 유틸리티에 비해 왜 그렇게 빠른가요?

GNU Find가 그래픽 파일 검색 유틸리티에 비해 왜 그렇게 빠른가요?

파일을 찾으려고 하는데아니요내 홈 디렉터리와 모든 하위 디렉터리에 존재합니다.

find ~/ -name "bogus"몇 초 후에 이 메시지를 보내주세요. 하지만KDE용 dolphin파일 관리자동일한 작업을 수행하는 데 약 3분이 소요됩니다. 이는 내 이전 경험과 일치합니다.난쟁이beagle.

find그래픽 검색(명령줄 인수보다 사용하기 더 직관적임)보다 뒤처지는 동안 동일한 작업을 어떻게 신속하게 수행할 수 있습니까 ?

답변1

구체적으로 Dolphin 및 Baloo를 살펴보면 간단한 파일 이름 검색을 수행하는 경우에도 검색 도메인의 모든 파일에 대한 메타데이터를 찾는 것으로 보입니다. 프로세스를 추적하면 file.so각 파일과 항목에 대한 호출이 계속해서 lstat표시 됩니다. getxattr이러한 시스템 호출은 파일 이름과 다른 위치에 저장된 파일에 대한 메타데이터를 검색합니다. 파일 이름은 디렉터리 내용에 저장되지만 메타데이터는getxattr..인덱스 노드). 파일의 메타데이터를 여러 번 쿼리하는 것은 데이터가 디스크 캐시에 있기 때문에 비용이 적게 들지만, 메타데이터를 쿼리하는 것과 메타데이터를 쿼리하지 않는 것 사이에는 상당한 차이가 있을 수 있습니다.

find훨씬 더 똑똑합니다. 불필요한 시스템 호출을 피하려고 합니다. getxattr확장된 속성을 기반으로 검색하지 않기 때문에 호출되지 않습니다 . 디렉토리를 탐색할 때 lstat일치하지 않는 파일 이름을 호출해야 할 수도 있습니다 . 이는 재귀적으로 검색할 하위 디렉토리일 수 있기 때문입니다( lstat이는 파일 유형을 포함한 파일 메타데이터를 반환하는 시스템 호출입니다(예: 일반 /directory/symlinks). /…) . 그러나 find최적화가 있습니다. 디렉토리에 하위 디렉토리가 몇 개 있는지 알고 있습니다.링크 수lstat, 모든 하위 디렉터리를 통과했다는 사실을 알게 되면 호출을 중지합니다. 특히 리프 디렉터리(하위 디렉터리가 없는 디렉터리)에서는 find이름만 확인하고 메타데이터는 확인하지 않습니다. 또한 일부 파일 시스템은 디렉터리 항목에 파일 형식의 복사본을 보관하므로 find이것이 필요한 유일한 정보인 경우 호출할 필요조차 없습니다.lstat

메타데이터 확인이 필요한 옵션을 사용하여 실행 하면 find더 많은 호출이 발생하지만 해당 정보가 필요하지 않은 경우(예: 이름과 일치하는 lstat이전 조건에 의해 파일이 제외되었기 때문에) 여전히 파일에 대해 호출을 수행하지 않습니다 . lstat.

find나는 바퀴를 재창조하는 다른 GUI 검색 도구가 수십 년 동안 최적화된 명령줄 유틸리티만큼 똑똑하지 않다고 생각합니다 . Dolphin은 적어도 "모든 곳"을 검색하는 경우 위치 데이터베이스를 사용할 만큼 똑똑합니다(그러나 사용자 인터페이스에서 명확하지 않다는 한계는 결과가 최신이 아닐 수 있다는 것입니다).

관련 정보