locate是在linux下實現快速尋找檔案的工具.相應的windows下有everything功能也很強大.現在要實現locate的GUI前端,就必須對locate作一番瞭解. 整個locate工作其實是由四部分組成的:
- /usr/bin/updatedb
- /usr/bin/locate or mlocate
- /etc/updatedb.conf
- /var/lib/mlocate/mlocate.db
updatedb主要用來更新資料庫,這個工作是通過crontab自動完成的.
mlocate/locate是作來完成查詢功能的程式;
updatedb.conf是配置要查詢哪些目錄, 哪些檔案;
mlocate.db則是存放檔案資訊的檔案;
對於mlocate.db,這是有一定格式的資料庫檔案. 也就是說資料庫檔案是由頭和資料群組成. 檔案開始的8byte是magic number, 其值是\0mlocate, 接下來的4byte是設定檔的大小,以大端模式存放. 然後1byte是檔案格式版本,目前為0. 再1byte是可見度標記(0或1), 接下來是2byte的填充位元組和以SMNUL結尾的根目錄名資料庫檔案.
所以對於mlocate.db的讀取需要遵循這一格式. header接下是配置塊. 其作用是當設定檔更新後,確保到期資料庫不會被使用. 配置塊的大小是在檔案頭以bytes為單位存放. 配置塊是一系列的以變數名排序的變數分配區. 每個變數分配是由變數名和順序的列表,它們都已SMNUL為結束符. 變數列表是由兩個NUL字元結束的. 排序的規則是基於strcmp()結果的.
當前定義的變數有:
prume_bind_mounts: 單節點, PRUNE_BIND_MOUNTS的值;
prunefs: PRUNEFS的值,每個節點轉換為大寫;
prunepaths: PRUNEPATHS的值;
檔案接下來的內容一直到檔案末尾描述了目錄和內容. 每個目錄有一個頭: 8byte目錄時間(以秒為單位),4byte目錄時間(以ns為單位).如果未知,則設為0, 其值小於1000000000. 4byte填儲值, SMUNL目錄終止符.
目錄內容,是一系列的檔案節點,按如下順序排列:
目錄時間是st_ctime和st_mtime的最大值. updatedb使用原始的資料如查目錄時間在資料庫中,並且和檔案系統匹配正確. 目錄時間為0,則會導致重新掃描目錄. 這是必要的.
每個檔案節點由單個位元組開始,標記它們的類型:
- 非目錄檔案, 檔案名稱以SMNUL終止;
- 子目錄,檔案名稱以SMNUL終止;
- 標記目前的目錄的結尾;