一種快速索引和查詢檔案系統的方法。取代locate/mlocate/updatedb。用 Rust 編寫。
Lolcate 是一個快速、輕量級、多功能的locate/mlocate/updatedb 替代品。
其特點:
Lolcate 以單一二進位執行檔出現。
Lolcate 不會嘗試與 mlocate / Updatedb 相容。
Lolcate 的營運分兩個階段:
它透過遵循您指定的一些索引規則來索引檔案系統的各個部分,以使用匹配路徑名稱清單填充其資料庫之一。
僅對檔案的路徑名稱進行索引,Lolcate 不關心其內容。
可以為不同的目的建立不同的資料庫。
無論何時需要,您都可以執行 locate 來對其資料庫執行查詢,它將傳回與您指定的查詢規則相符的路徑名稱。
相同的lolcate
二進位可執行檔執行索引和查詢。
使用 shell 別名和函數根據您的喜好查詢資料庫,例如
alias d= ' lolcate --db documents '
alias zik= ' lolcate --db music --type audio '
z (){ mpv --playlist <( zik $1 ) ; }
zs (){ mpv --playlist <( zik $1 | shuf ) ; }
建立資料庫
在使用Lolcate之前,需要建立一個資料庫。讓我們創建一個:
$ lolcate --create
Created database ' default ' .
Please edit:
- the configuration file: /home/ngirard/.config/lolcate/default/config.toml
- the ignores file: /home/ngirard/.config/lolcate/default/ignores
由於我們沒有指定資料庫的名稱,Lolcate 選擇了名稱default
。我們可以使用lolcate --create --db <db_name>
指定資料庫的名稱。
索引規則:指定要索引的內容
接下來,我們需要透過編輯兩個檔案(這可能在未來版本中更改)來指定要索引的內容: config.toml
檔案和ignores
檔案。
config.toml
檔案不是空的,而是充滿了您需要自訂的樣板內容。它應該看起來像這樣:
description = " "
# Directories to index.
dirs = [
# "~/first/dir",
# "/second/dir"
]
# Set to "Dirs" or "Files" to skip directories or files.
# If unset, or set to "None", both files and directories will be included.
# skip = "Dirs"
# Set to true if you want skip symbolic links
ignore_symlinks = false
# Set to true if you want to index hidden files and directories
ignore_hidden = false
# Set to true to read .gitignore files and ignore matching files
gitignore = false
我們來修改它並添加兩個目錄用於索引:
dirs = [
"~/Images",
"~/Documents"
]
正如您所注意到的,目錄必須用引號引起來並以逗號分隔。此外,目錄中的波形符號會擴展,但環境變數不會擴展。
我們可以透過設定skip = "Dirs"
選擇僅索引文件,透過設定skip = "Files"
選擇僅索引目錄。此外,可以透過分別設定ignore_symlinks = true
和ignore_hidden = true
來跳過符號連結和隱藏檔案和目錄。
ignores
檔案包含 Lolcate 將在索引檔案系統時用來忽略符合路徑名稱的模式。 ignores
檔案的語法與 .gitignore 檔案的語法相同。如果您想根據config.toml
檔案對所有內容進行索引,可以將其留空。
讓我們修改它並添加這兩個模式:
.git
*~
索引檔案系統
現在,我們準備告訴 Lolcate 根據我們剛剛指定的規則索引檔案系統:
$ lolcate --update
Updating default...
同樣,Lolcate 預設更新default
資料庫。我們可以選擇輸入lolcate --update --db <other_db>
來更新另一個資料庫。我們也可以輸入lolcate --update --all
來要求 Lolcate 更新我們擁有的所有資料庫。
查詢資料庫
現在我們的資料庫已填充,我們可以對其執行查詢。
最簡單的形式就是lolcate [--db <dbname>]
:
$ lolcate
/home/ngirard/Images/DCIM_101CANON/_MG_0006.jpg
/home/ngirard/Images/DCIM_101CANON/_MG_0007.jpg
/home/ngirard/Images/DCIM_101CANON/_MG_0004.jpg
(...)
如果未給予模式,查詢將傳回資料庫中的所有內容。
lolcate --all
將傳回所有資料庫中的所有內容。
我們可能還想透過執行lolcate [--db <dbname>] <pattern>
來指定模式:
$ lolcate 2018
/home/ngirard/Images/2018/01/9/IMG_1057.JPG
/home/ngirard/Images/2018/01/9/IMG_1059.JPG
/home/ngirard/Images/2018/01/9/IMG_1060.JPG
(...)
模式被解釋為正規表示式。
例如,讓我們尋找包含 2018 或 2019 的任何路徑名:
$ lolcate 201[89]
/home/ngirard/Images/2018/01/9/IMG_1057.JPG
/home/ngirard/Images/2018/01/9/IMG_1059.JPG
(...)
/home/ngirard/Images/2019/01/9/IMG_1055.JPG
/home/ngirard/Images/2019/01/9/IMG_1058.JPG
(...)
此處提供了 Lolcate 使用的正規表示式引擎的完整語法。
可以使用lolcate <pattern1> <pattern2> ...
指定多個模式。
例如,讓我們從 Images 目錄中尋找所有自述文件:
$ lolcate Images readme
/home/ngirard/Images/DCIM_101CANON/readme.txt
/home/ngirard/Images/2019/01/1/Readme
/home/ngirard/Images/2018/01/1/readme
預設情況下,模式搜尋是“smart-case”。這意味著當模式全部為小寫時,將不區分大小寫地搜尋模式,否則將敏感地搜尋模式。
例如,使用“Readme”而不是“readme”運行最新查詢會給出:
$ lolcate Images Readme
/home/ngirard/Images/2019/01/1/Readme
我們可以使用-i | --case-insensitive
執行不區分大小寫的搜索-i | --case-insensitive
選項:
$ lolcate -i Images README
/home/ngirard/Images/DCIM_101CANON/readme.txt
/home/ngirard/Images/2019/01/1/Readme
/home/ngirard/Images/2018/01/1/readme
/home/ngirard/Documents/READMEs/2018-05-15-Cropping_images.txt
/home/ngirard/Documents/READMEs/2018-05-15-Cropping_images_fig1.jpg
/home/ngirard/Documents/READMEs/2018-05-15-Cropping_images_fig2.png
使用-b | --basename
只能將模式與路徑名的基本名稱進行比對。 -b | --basename
選項:
$ lolcate -b images
/home/ngirard/Documents/READMEs/2018-05-15-Cropping_images.txt
/home/ngirard/Documents/READMEs/2018-05-15-Cropping_images_fig1.jpg
/home/ngirard/Documents/READMEs/2018-05-15-Cropping_images_fig2.png
可以定義和查詢路徑類型。
可以透過將路徑類型新增至 Lolcate 的全域設定檔來定義它們。我們可以透過呼叫--info
選項來找到該檔案:
$ lolcate --info
Config file:
/home/ngirard/.config/lolcate/config.toml
(...)
預先定義了以下路徑類型:
[types]
img = ".*\.(jp.?g|png|gif|JP.?G)$"
video = ".*\.(flv|mp4|mp.?g|avi|wmv|mkv|3gp|m4v|asf|webm)$"
doc = ".*\.(pdf|chm|epub|djvu?|mobi|azw3|odf|ods|md|tex|txt)$"
audio = ".*\.(mp3|m4a|flac|ogg)$"
這些路徑類型可以在查詢中使用:
$ lolcate --type img cropping
/home/ngirard/Documents/READMEs/2018-05-15-Cropping_images_fig1.jpg
/home/ngirard/Documents/READMEs/2018-05-15-Cropping_images_fig2.png
路徑名稱模式、基本名稱模式和類型模式可以混合在一起:
$ lolcate --basename [eé]conomie --type doc
/home/ngirard/Documents/Notes/2018-11-12-Economie_politique.tex
/home/ngirard/Documents/Notes/2019-01-03-Économie_politique.md
$ lolcate --basename [eé]conomie --type doc 2018
/home/ngirard/Documents/Notes/2018-11-12-Economie_politique.tex
設定檔儲存在$XDG_CONFIG_HOME/lolcate
或$HOME/.config/lolcate
中;
資料庫檔案儲存在$XDG_DATA_HOME/lolcate
或$HOME/.local/share/lolcate
中。
mlocate
的差異以下 Locate 選項在 Lolcate 中沒有等值: --count
、 --existing
、 --follow
、 --transliterate
、 --limit
、 --nofollow
、 --null
。
這是最簡單且推薦的方法。
從 Github 下載最新的lolcate
預編譯二進位檔案到屬於您的PATH
目錄中。
預先編譯的二進位檔案可用於 Linux、MacOS 和 Windows。
如果需要,請使用以下命令安裝 Rust 和 Cargo 的當前穩定版本
$ curl https://sh.rustup.rs -sSf | sh
如果需要,請使用以下指令將~/.cargo/bin
加入您的PATH
:
$ export PATH= $HOME /.cargo/bin: $PATH
跑步
$ cargo install lolcate-rs
從最新版本編譯原始碼,或者
$ cargo install --git https://github.com/ngirard/lolcate-rs
從 GitHub 儲存庫編譯最新版本的原始程式碼。
雖然歡迎所有貢獻,但對我來說理想的貢獻是細粒度的拉取請求,因為它們可以讓我在審查它們時提高我的 Rust 素養。提前致謝 !
您可能需要考慮在許多領域做出貢獻:
最需要的功能是圖案匹配的彩色列印輸出(#13)。
Lolcate 尚不能用作庫。
我對將忽略規則保存在單獨的設定檔中不滿意(#14)。
測試。
我對可以重複使用/利用現有程式碼的建議非常感興趣,以便為 Lolcate 提供完整的測試平台。
後端策略。
Lolcate 目前將其資料儲存為 lz4 壓縮的路徑名列表,並在每次執行lolcate --update
時重新建立它。它就像你能得到的一樣簡單。儘管它足夠適合我的口味,但我很樂意考慮替代方案(#15)。
標竿管理
(#16)
我要感謝 Rust 社群創造瞭如此優秀的開發環境。這是我迄今為止工作過的最好的環境!
非常感謝 Andrew Gallant 的出色工作和他編寫的寶貴的板條箱,Lolcate 依賴這些(正規表示式、忽略、walkdir)。
Lolcate 目前使用的只是重新建立資料庫而不是出於效能目的而更新資料庫的方法,已在 Internet 上多次討論。我找不到相關筆記,因此我很樂意分享您可以提供的任何參考資料。
「lolcate」這個名字已經被用於 2012 年作為 Github Gist 發布的原型 shell 腳本。
笑貓圖片來源:Rikki's Refuge