馮荷飛 孫前
摘 要:本地計(jì)算機(jī)內(nèi)文件數(shù)量逐年增長(zhǎng),并且文件和目錄還處于不斷的變化中,比如新增、刪除、修改等,因而用戶(hù)想要快速定位到所需文件也是越發(fā)困難。隨著Linux操作系統(tǒng)的推廣,普通Linux用戶(hù)更需要一款易用的本地文件快速搜索工具。在業(yè)務(wù)邏輯模塊中建立全盤(pán)索引、更新文件索引信息,采用Tkinter庫(kù)設(shè)計(jì)圖形用戶(hù)界面,以SQlite嵌入式數(shù)據(jù)庫(kù)管理索引數(shù)據(jù),并使用inotify接口調(diào)用Linux內(nèi)核特性來(lái)監(jiān)控文件系統(tǒng)的變化?;诖?,本文使用Python語(yǔ)言開(kāi)發(fā)了一款輕量級(jí)的本地文件搜索工具,并能夠方便普通Linux用戶(hù)的快速搜索需求。
關(guān)鍵詞:Linux;本地文件;搜索;快速
中圖分類(lèi)號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A
Abstract:Given that local files in computers increase year by year,and files and catalogues are in continuous changes,such as add,delete,modify,etc.,it becomes more difficult for users to fast locate the required documents.With the promotion of the Linux operating system,ordinary Linux users need an easy-to-use fast searching tool for local files.In the business logic module,the paper sets up index,updates file index information,uses Tkinter library to design GUI,manages data with SQlite embedded database,and applies Inotify interface to call Linux kernel characteristics to monitor file system changes.Based on this,this paper uses the Python language to develop a convenient local file searching tool,which can facilitate the rapid search requirements of ordinary Linux users.
Keywords:Linux;local files;search;fast
1 引言(Introduction)
在現(xiàn)今信息化時(shí)代,大數(shù)據(jù)概念已深入人心,各種類(lèi)型信息、資源層出不窮。個(gè)人計(jì)算機(jī)中的文件越來(lái)越多,用戶(hù)想要快速定位到所需文件也是越發(fā)困難。操作系統(tǒng)自帶的文件搜索工具搜索速度較慢。因而在Windows平臺(tái)下出現(xiàn)了一大批由第三方開(kāi)發(fā)的本地文件快速搜索工具,其中最著名的則是Everything軟件[1]。近年來(lái)隨著Linux操作系統(tǒng)的大力推廣,眾多國(guó)內(nèi)Linux發(fā)行版中的中標(biāo)麒麟、優(yōu)麒麟、Deepin日益成熟,不少普通用戶(hù)也選擇了Linux系統(tǒng)。而Linux系統(tǒng)下卻沒(méi)有簡(jiǎn)單易用的本地快速搜索工具。因此開(kāi)發(fā)一款滿(mǎn)足普通用戶(hù)的輕量級(jí)本地文件搜索工具顯得十分有必要。
2 Linux下的文件查找方法(The file locating method in Linux)
任何一種操作系統(tǒng)都由成千上萬(wàn)的文件組成,Linux系統(tǒng)更是認(rèn)為“一切皆文件”。普通的文件、目錄、字符設(shè)備、塊設(shè)備、套接字等在Linux中都是以文件被對(duì)待。雖然類(lèi)型不同,但是對(duì)其提供的卻是同一套操作接口。在Linux系統(tǒng)中準(zhǔn)確高效地確定一個(gè)文件在系統(tǒng)中的具體位置一般來(lái)說(shuō)有三種搜索方法,即使用文件管理器,使用find命令,使用locate命令。
2.1 文件管理器
文件管理器是Linux系統(tǒng)桌面版的必備工具,常見(jiàn)的有Nautilus、Dolphin、Nemo、Peony。它們都提供了方便的文件管理功能,包括瀏覽、復(fù)制、剪切、粘貼、刪除、搜索等。文件管理器是普通用戶(hù)最常用的文件搜索工具。但因其在搜索文件時(shí)需要掃描整個(gè)磁盤(pán)文件,因而搜索時(shí)間常常會(huì)很長(zhǎng)。
2.2 find命令
find命令根據(jù)文件的屬性進(jìn)行查找,如文件名、文件大小、所屬組、所有者、訪問(wèn)時(shí)間、修改時(shí)間等。基本語(yǔ)法如下:# find path expression search-term。例如使用find命令根據(jù)文件名來(lái)查找特定文件時(shí)可以用:# find\-name "test.file"。該命令會(huì)搜索整個(gè)目錄樹(shù)來(lái)查找名為test.file的文件,并且會(huì)提供其存放位置。find命令有時(shí)會(huì)花費(fèi)十幾分鐘來(lái)查找整個(gè)目錄樹(shù),特別是當(dāng)系統(tǒng)中有很多文件和目錄時(shí)搜索時(shí)間會(huì)更長(zhǎng)。
2.3 locate命令
locate是一種比f(wàn)ind速度更快的文件搜索方式。它事先構(gòu)建索引數(shù)據(jù)庫(kù),通過(guò)匹配文件信息進(jìn)而定位符合條件的文件。索引的構(gòu)建過(guò)程需要遍歷整個(gè)根文件系統(tǒng),較為耗費(fèi)資源,因此其常常在系統(tǒng)較為空閑時(shí)進(jìn)行。locate屬于非實(shí)時(shí)查找,使用locate搜索文件的語(yǔ)法為:# locate filename。例如,使用# locate TKinter命令可得到如圖1所示的搜索結(jié)果。
此外locate有很多選項(xiàng)來(lái)過(guò)濾輸出。如果要更新搜索數(shù)據(jù)庫(kù),可以運(yùn)行命令:# updatedb。就如同find命令一樣,locate查詢(xún)文件得到的也只是文件的地址。如果想要定位到被查詢(xún)文件,則還需另外的命令,比如:# nautilus [文件目錄](méi)。并且locate的文件索引數(shù)據(jù)庫(kù)不是實(shí)時(shí)更新的,對(duì)于一些新文件可能會(huì)搜索不到。
3 軟件結(jié)構(gòu)設(shè)計(jì)(Software structure design)
本文所述的軟件體量較小,總體結(jié)構(gòu)采用簡(jiǎn)化的MVC模式。軟件分為三個(gè)模塊,采用將業(yè)務(wù)邏輯、后臺(tái)數(shù)據(jù)與界面顯示分離的方式來(lái)組織代碼。使用模塊分離的方式有代碼耦合性低、重用性高的優(yōu)點(diǎn),并且當(dāng)軟件需求變更、算法改進(jìn)、界面美化時(shí)更易于維護(hù)和修改。
3.1 業(yè)務(wù)邏輯模塊
業(yè)務(wù)邏輯模塊(Module.py)用于處理應(yīng)用程序數(shù)據(jù)邏輯,它包含了一些函數(shù)和全局變量,其中主要函數(shù)見(jiàn)表1。這些函數(shù)實(shí)現(xiàn)了指定目錄下文件索引建立、創(chuàng)建數(shù)據(jù)庫(kù)、數(shù)據(jù)入庫(kù)、數(shù)據(jù)查詢(xún)以及文件索引實(shí)時(shí)更新等功能。
表1 業(yè)務(wù)邏輯模塊中的主要函數(shù)
Tab.1 The main function in the business logic module
函數(shù) 描述
def create_db(): #創(chuàng)建sqlite數(shù)據(jù)庫(kù),用于存儲(chǔ)文件索引信息
def index_all_files(dir_path): #遍歷dir_path磁盤(pán)目錄,并保存得到的文件索引信息
def insert_to_db(file_path,file_name): #插入文件索引記錄到sqlite數(shù)據(jù)庫(kù)
def InitDB(): #完成初始化工作,通過(guò)調(diào)用上述三個(gè)方法來(lái)建立數(shù)據(jù)庫(kù)、獲取文件索引、索引信息入庫(kù)
def find_file(file_name): #在數(shù)據(jù)庫(kù)中查找文件信息,主要工作是使用sql語(yǔ)句在數(shù)據(jù)庫(kù)中查詢(xún)
def updateDB(dir_path): #實(shí)時(shí)監(jiān)控dir_path目錄下的文件變化情況,如有變動(dòng)立即更新文件索引到數(shù)據(jù)庫(kù)中
3.2 后臺(tái)數(shù)據(jù)模塊
本文使用SQLite數(shù)據(jù)庫(kù)進(jìn)行后臺(tái)數(shù)據(jù)管理。SQLite是一個(gè)嵌入式開(kāi)源的關(guān)系數(shù)據(jù)庫(kù),其特點(diǎn)是自包容、零配置、無(wú)服務(wù)端和支持事務(wù)。在大多數(shù)情況下只要確保SQLite的二進(jìn)制文件存在即可創(chuàng)建、連接和使用數(shù)據(jù)庫(kù)。它能夠支持Windows/Linux/Unix等主流操作系統(tǒng),同時(shí)能夠跟很多程序語(yǔ)言相結(jié)合,并且還有ODBC接口[2]。
可使用如下python腳本創(chuàng)建SQlite數(shù)據(jù)庫(kù)文件[3]:
sqlite_con=sqlite3.connect('fileIndex.db')
sqlite_cur=sqlite_con.cursor()
sqlite_cur.execute('CREATE TABLE FOO (o_id INTEGER PRIMARY KEY, file_path VARCHAR(260), file_name VARCHAR(260))')
sqlite_con.commit
創(chuàng)建SQlite數(shù)據(jù)文件后就可以正常使用SQL語(yǔ)句來(lái)操作數(shù)據(jù)庫(kù)了??墒褂萌缦聀ython腳本語(yǔ)句:
sqlite_cur.execute('INSERT INTO FOO (o_id, file_path, file_name)VALUES(NULL,?,?)',[file_path.decode('utf-8'),file_name.decode('utf-8 ')])
將單個(gè)文件的索引信息作為一條記錄存入數(shù)據(jù)庫(kù)中。
3.3 界面顯模塊
Python作為一種腳本語(yǔ)言,開(kāi)發(fā)圖形用戶(hù)界面并不是它的強(qiáng)項(xiàng)。但開(kāi)發(fā)人員仍然有多種選擇,包括wxWidgets、PyQt、PyGTK和Tkinter等[4]。
(1)wxPython是Python語(yǔ)言的一套開(kāi)源GUI庫(kù),它是wxWidgets的Python封裝,以Python模塊的方式提供給用戶(hù)。同時(shí)wxPython具有非常優(yōu)秀的跨平臺(tái)能力,能夠運(yùn)行在Windows系統(tǒng)、絕大多數(shù)的Unix或類(lèi)Unix系統(tǒng)、Macintosh OS上。
(2)PyQt是Qt庫(kù)的Python版本。它實(shí)現(xiàn)了一個(gè)Python模塊集,有超過(guò)300個(gè)類(lèi),將近6000個(gè)函數(shù).它是一個(gè)多平臺(tái)的工具包,可以運(yùn)行在大部分操作系統(tǒng)上,包括UNIX、Windows和Mac。PyQt采用雙許可證,開(kāi)發(fā)人員可以選擇GPL或商業(yè)許可。
(3)Tkinter是Python的標(biāo)準(zhǔn)GUI庫(kù),是一個(gè)輕量級(jí)的跨平臺(tái)圖形用戶(hù)界面開(kāi)發(fā)工具。Tkinter是內(nèi)置庫(kù),由一定數(shù)量的模塊組成,與Python的結(jié)合度最好。Tkinter位于一個(gè)名為_(kāi)tkinter的二進(jìn)制模塊中。只要安裝好Python,就能通過(guò)import Tkinter導(dǎo)入并調(diào)用[5]。
Tkinter的不足之處是缺少可視化界面設(shè)計(jì)工具,需要通過(guò)代碼來(lái)完成窗口設(shè)計(jì)和元素布局。IDLE是開(kāi)發(fā)python程序的基本IDE(集成開(kāi)發(fā)環(huán)境),而IDLE本身也是用Tkinter編寫(xiě)而成??梢?jiàn)對(duì)于簡(jiǎn)單的圖形界面,Tkinter還是能應(yīng)付自如,因而使用TKinter作為本文程序界面也是最合適的。
4 數(shù)據(jù)實(shí)時(shí)更新(Real-time data update)
inotify是一個(gè)Linux的內(nèi)核特性,提供了一種監(jiān)控文件系統(tǒng)事件的機(jī)制。它可以監(jiān)控文件系統(tǒng)的變化,如文件修改、新增、刪除等,并能將相應(yīng)的事件通知給應(yīng)用程序[6]。此功能從kernel 2.6.13開(kāi)始正式并入內(nèi)核,可以使用“l(fā)l /proc/sys/fs/inotify命令”來(lái)檢查內(nèi)核是否加入了inotify的支持[7]。
4.1 安裝inotify-tools
要想方便地使用inotify,還需要安裝inotify-tools來(lái)控制內(nèi)核的這種功能。inotify-tools是一套組件,它包括一個(gè)C庫(kù)和幾個(gè)命令行工具,這些命令行工具可用于通過(guò)命令行或腳本對(duì)某文件系統(tǒng)的事件進(jìn)行監(jiān)控。inotify-tools的安裝腳本如下:
wget http://github.com/downloads/rvoicilas/inotify
-tools/inotify-tools-3.14.tar.gz
tar xzf inotify-tools-3.14.tar.gz ;
cd inotify-tools-3.14
./configure --prefix=/usr && make && su -c 'make install'
4.2 實(shí)時(shí)監(jiān)控和更新文件索引
inotifywait是inotify-tools中的一個(gè)命令,用于等待文件或者文件集上的一個(gè)特定事件。它可以監(jiān)控任何文件或者目錄,并且可以遞歸地監(jiān)控整個(gè)目錄樹(shù)。inotifywait命令的基本語(yǔ)法為:
inotifywait [-hcmrq] [-e] [-t] [--format] [--timefmt] [ ... ]。
其中的部分參數(shù)說(shuō)明:
-m:一直監(jiān)視指定目錄,如果沒(méi)有這個(gè)選項(xiàng)則接收到一個(gè)事件后就退出。
-r:遞歸監(jiān)視指定目錄,即包括所有子目錄。
-q:輸出少量事件信息,無(wú)附加開(kāi)頭的說(shuō)明信息。
應(yīng)用程序在使用inotifywait命令得到監(jiān)控目錄變化事件后,保存變化的信息,并更新數(shù)據(jù)庫(kù)中的信息。主要腳本如下:
#!/bin/sh
src=/home/sundoo/文檔/xz #要監(jiān)控的目錄
/usr/local/bin/inotifywait -rmq --format '%e %w %f' -e modify,delete,create $src | while read eventName dirName fileName;
do
echo "-- 事件:$eventName 文件:$fileName 目錄:$dirName" >> Log.txt
/bin/bash update.sh #更新數(shù)據(jù)庫(kù)
done
5 開(kāi)發(fā)案例及運(yùn)行效果(Development case and operation effect)
本文選用Phthon語(yǔ)言作為開(kāi)發(fā)工具。各個(gè)Linux發(fā)行版通常都會(huì)自帶Python,選用Python開(kāi)發(fā)免去了安裝配置,甚至直接使用文本編輯工具即能完成編碼。本文實(shí)際環(huán)境:操作系統(tǒng)為Ubuntu Kylin17.10,開(kāi)發(fā)工具為Eclipse+PyDev插件。硬件為i5-4200M CPU,ddr3 1600 6GB內(nèi)存,固態(tài)加機(jī)械硬盤(pán)。軟件運(yùn)行效果如圖2所示。
作為一個(gè)輕量級(jí)的本地文件即時(shí)搜索工具,核心指標(biāo)是滿(mǎn)足Linux下普通用戶(hù)的快速搜索需求。采用本文開(kāi)發(fā)的軟件搜索速度極快,用戶(hù)體驗(yàn)上能夠達(dá)到回車(chē)即見(jiàn)結(jié)果。同時(shí)軟件支持模糊查詢(xún),只要記得部分文件名即可。得到搜索結(jié)果列表后只需要雙擊即可定位打開(kāi)所需文件,并且實(shí)現(xiàn)了文件索引的實(shí)時(shí)更新。
6 結(jié)論(Conclusion)
實(shí)測(cè)中建立/home、/media兩塊硬盤(pán)索引,共生成874503條記錄,用時(shí)879秒,耗時(shí)較長(zhǎng)。下一步可以采用多線(xiàn)程技術(shù)、優(yōu)化SQL命令和文件索引算法來(lái)減少建立全盤(pán)索引時(shí)間,以及通過(guò)美化界面,提高搜索的智能化,來(lái)進(jìn)一步方便普通Linux用戶(hù)使用。
參考文獻(xiàn)(References)
[1] 劉艷,楊奇龍,蔡燕冬.FileFinder:桌面搜索引擎的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程與設(shè)計(jì),2013,34(7):2627-2631.
[2] 陳華政,陳劍.基于SQLite的中文全檢索研究與實(shí)現(xiàn)[J].軟件導(dǎo)刊,2013,12(7):138-140.
[3] 戴昱,黃德才.SQLite的SQL語(yǔ)句高速緩存技術(shù)[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2012,21(1):183-185.
[4] 韓宏峰,馮石,羅羿隆.基于Java與Python的面向?qū)ο缶幊痰幕咎卣餮芯縖J].軟件工程,2017,20(8):1-3.
[5] 嵩天,禮欣,黃天羽.python語(yǔ)言程序設(shè)計(jì)基礎(chǔ)[M].北京:高等教育出版社,2017:6-13.
[6] 楊凱飛,李文波,柯川.面向桌面環(huán)境的索引實(shí)時(shí)更新方法[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2017,26(10):20-28.
[7] Chun W J.宋吉廣,譯.Python核心編程(第2版)[M].北京:人民郵電出版社,2008:1-23.
作者簡(jiǎn)介:
馮荷飛(1983-),女,碩士,講師.研究領(lǐng)域:計(jì)算機(jī)軟件理論,人工智能.
孫 前(1984-),男,碩士,工程師.研究領(lǐng)域:作戰(zhàn)仿真,數(shù)據(jù)分析.