그래픽 파일 검색 유틸리티와 비교하여 GNU가 왜 그렇게 빨리 찾습니까? find ~/ -name “bogus”몇 초

내 홈 디렉토리와 모든 하위 디렉토리에 존재 하지 않는 파일을 찾으려고합니다 .

find ~/ -name "bogus"몇 초 후에 정보를 제공하지만 KDE의 dolphin파일 관리자 는 거의 3 분이 걸렸습니다 . 이것은 그놈beagle 에 대한 나의 이전 경험과 일치 합니다.

find그래픽 검색 (명령 줄 매개 변수보다 사용하기가 더 직관적 임) 동안 어떻게 똑같이 빠른 속도로 작업을 수행합니까?



답변

Baloo를 사용하여 Dolphin을 구체적으로 살펴보면 간단한 파일 이름 검색을 수행하더라도 검색 도메인에있는 모든 파일의 메타 데이터를 찾는 것 같습니다. 나는 추적 할 때 file.so과정을, 나는 호출보고 lstat, getxattr그리고 getxattr다시 모든 파일에 대해, 심지어에 대한 ..항목을. 이러한 시스템 호출은 파일 이름과 다른 위치에 저장된 파일에 대한 메타 데이터를 검색합니다 (파일 이름은 디렉토리 내용에 저장되지만 메타 데이터는 inode에 있음 ). 데이터가 디스크 캐시에 있기 때문에 파일의 메타 데이터를 여러 번 쿼리하는 것이 저렴하지만 메타 데이터를 쿼리하는 것과 메타 데이터를 쿼리하지 않는 것 사이에는 상당한 차이가있을 수 있습니다.

find훨씬 더 영리합니다. 불필요한 시스템 호출을 피하려고 시도합니다. getxattr확장 된 속성을 기반으로 검색하지 않기 때문에 호출 되지 않습니다. 디렉토리를 순회하는 경우 lstat일치하지 않는 파일 이름 을 호출해야 할 수 있습니다. 이는 일치하는 하위 디렉토리 일 수 있기 때문입니다 ( lstat정규 / 디렉토리 / symlink /…와 같은 파일 유형을 포함하여 파일 메타 데이터를 리턴하는 시스템 호출입니다). 그러나 find최적화 기능이 있습니다. 디렉토리가 링크 수 에서 몇 개의 서브 디렉토리를 가지고 있는지 lstat알고 있으며 모든 서브 디렉토리를 순회하는 것으로 알게되면 호출을 중지 합니다. 특히 리프 디렉토리 (하위 디렉토리가없는 디렉토리)에서find메타 데이터가 아닌 이름 만 확인합니다. 또한 일부 파일 시스템은 파일 유형의 사본을 디렉토리 항목에 보관하므로 find필요한 lstat정보 만 있으면 호출 할 필요가 없습니다 .

find메타 데이터를 확인해야하는 옵션으로 실행 하는 경우 더 많은 lstat호출을 수행하지만 lstat정보가 필요하지 않은 경우 파일을 계속 호출하지 않습니다 (예 : 파일이 이전 조건에 의해 제외 되었기 때문에) 이름과 일치).

find휠 을 재발 명하는 다른 GUI 검색 도구가 수십 년 동안 최적화를 거친 명령 줄 유틸리티보다 덜 영리 하다고 생각합니다 . Dolphin은 “어디서나”(UI에서 결과가 최신이 아닐 수 있다는 한계가 있음)를 검색 할 경우 찾기 데이터베이스를 사용할 정도로 영리합니다.


답변