簡體中文
跨平台檔案系統索引器和搜尋器,結合了find
、 locate
和Everything
的優點以及檔案內容搜尋。適用於 Linux、macOS 和 Windows。
倒排索引是plocate
背後的技術,它使搜尋在接近恆定的時間內完成,在v0.4.0
及更高版本中實現。不幸的是v0.4
沒有經過充分測試,目前發布的是v0.3.x
。此外,自述文件中的所有演示都是在v0.3.0
上完成的。對於檔案通常小於 3M 的個人電腦來說,倒排索引並沒有太大的差異。
內容搜尋未編入索引。如果此儲存庫達到 512 顆星,則將建立索引檔案內容索引,因此,如果該應用程式證明對您有用或您發現它有趣,請粉碎該星形按鈕!
(更多相關資訊請點擊此處。)
本自述文件是關於 CLI 應用程式的。對於 GUI 前端,請參閱 SearchEverywhere。 (也很不穩定)
該專案自 2022 年 8 月開始工作,但由於存在無數 bug,直到 2023 年 4 月才發布。不過,即使在穩定版本( v0.3.x
)上,目前仍可能存在無數錯誤。
唯一的運行時相依性是 PCRE2,完全靜態的可執行檔大小僅為 2.5MiB(已刪除)。
macOS 和 Windows 上第一個 Libre 檔案索引器!
find
macOS Firmlink /System/Volumes/Data
分別在 macOS 和 Windows 上的螢幕截圖:
updatedb
(僅限SSD)與locate
不同,重建檔案系統索引不需要root權限(或Windows上的管理員權限)。也沒有setugid。
對於SSD來說,為並發目錄讀取設定了執行緒池,大大加快了讀取速度。
對於 HDD,應停用此功能,因為多執行緒 IO 由於其旋轉特性而不會帶來明顯的效能提升。
是否應啟用多執行緒updatedb
可以按路徑切換。
從圖中可以看出,在cache drop的情況下, orient
可以在1秒內掃描810000個文件,但使用的磁碟是相當高階的磁碟。不過,請持保留態度。
與updatedb
一樣,相同的執行緒池也用於內容匹配。當快取被丟棄時,從 75000 個檔案的 Linux 核心原始碼樹中模糊匹配hello world
需要 5.5 秒,而當快取被丟棄時,則需要 1.5 秒。
(保留態度;16x Intel i7 11800H 和 NVMe SSD)
在 Windows 上,內容匹配速度明顯較慢,這是 UTF8 到 UTF16 轉換、缺乏有效的內核記憶體映射 (
mmap(2)
) 以及 Windows 臃腫、低效本質的綜合影響。
再見, find ... | xargs grep ...
並find ... -a -exec grep ...
find
的語法如下所示, orient
還實現了find
的大部分匹配功能,使用戶能夠輕鬆熟悉find
現有使用經驗,同時也增加了應用程式的多功能性。
與僅將父級匹配硬編碼為字串匹配的Everything
不同,在orient
中, -updir -downdir
可以應用於任何謂詞。
此外, -downdir
開銷幾乎為 0,而-updir
透過快取最近的匹配項使搜尋速度更快。
匹配父級:
配對的孩子:
Linux | 視窗 | macOS | 安卓 | 執照 | |
---|---|---|---|---|---|
Everything | ? | ? | ? | ? | 所有權 |
find | ? | ? | ? | ? | GPLv3 |
fsearch | ? | ? | ? | ? | GPLv2 |
locate | ? | ? | ? | ? | GPLv3 |
orient | ? | ? | ? | ? | GPLv3 |
續表
-and -or | 倒排索引 | 配對家長 | 圖形使用者介面 | 命令列介面 | |
---|---|---|---|---|---|
Everything | ? | ? | 部分的 | ? | ? |
find | ? | ? | ? | ? | ? |
fsearch | ? | ? | 部分的 | ? | ? |
locate | ? | ? | ? | ? | ? |
orient | ? | ? | ? | ? | ? |
筆記:
Everything
CLI 似乎所有結果都經過美化,使其很難與其他工具結合使用,因此?臉。eVeRyThInG
專有的,僅提供 SDK!我們親愛的領袖理查德·斯托曼將會用核武摧毀它!更糟的是,
Everything SDK
充滿了全域狀態。
find
的語法熟悉find
的使用者可以立即使用orient
的find
相容謂詞,例如-regex
、 -lname
、 -okdir
等。
請注意, orient
謂詞有時是其find
項的超集,例如-quit
可選擇接受整數參數,這意味著在退出之前可以產生多少個結果。它的預設值為 1,因此當使用不帶參數的-quit
時,它與find
中的沒有區別。
對於特定於orient
謂詞,僅提供orient
樣式語法,請參閱下文。
# mp3 or mp4 file excluding under hidden dirs
find ~ ( -name " .* " -a -prune -a -false ) -o -name " *.mp[34] "
orient ~ ( -name " .* " -a -prune -a -false ) -o -name " *.mp[34] "
# Ask user to whether to show its realpath when a symlink found in /usr
# until user inputs "yes" (realpath executes)
find /usr -type l -a -okdir realpath {} ; -a -quit
orient /usr -type l -a -okdir realpath {} ; -a -quit
# Until 2 user inputs "yes"
orient /usr -type l -a -okdir realpath {} ; -a -quit 2
# Even better, -quitmod
orient /usr -quitmod ( -type l -a -okdir realpath {} ; )
# -quit -quitmod has some quirks; see docs/predicates.md
orient
的替代語法orient
沒有像find
那麼多(唯一)謂詞。相反, orient
使用-PRED --ARG
語法,為單一謂詞提供多個匹配方案,從而提高程式碼的可重用性。
-name
-bregex
-strstr
-fuzz
--ignore-case
(除了-fuzz
) --full
--readlink
-content-{strstr,fuzz,regex}
--ignore-case
(fuzz 除外) --blocked
--allow-binary
-size
-{a,m,c}{time,min}
-inum
+
或-
整數許多find
相容謂詞其實是別名,例如-lname
與-name --readlink
相同-regex
- -bregex --ignore-case
( b
代表基本名稱)
-samefile
基本上是-inode
因為-inode
也接受檔名
也可以將兩種文法混合在一起,但不建議
像-iname --full
或-anewer +5
以下是一些簡單的例子。請在此處查看有關如何使用它們的更多資訊。
# Find C source files containing "hello"; orient style only
orient / -content-strstr hello -name " *.c "
# Many `find` style predicates are actually aliases, ex:
orient / -iname " *.cpp " # find style
orient / -name --ignore-case " *.cpp " # orient style
# Assuming /home/a/b links to /var/tmp, then
# all the following 3 lines matches /home/a/b
# `-lname` is identical to `-name --readlink`
orient / -lname " *tmp "
orient / -name --readlink " *tmp "
# `orient` style is more versatile:
orient / -bregex --readlink ' tmp$ ' # No `find` style alternative
透過引入修飾謂詞,可以在傳播到其他 pred 之前“做某事”,這正是-updir
和-downdir
的作用:它們匹配文件的父級和目錄的子級。
使用修飾符, -updir -downdir
可以應用於orient
中的任何謂詞,這與硬編碼父級匹配僅與字串匹配的Everything
不同。
任何謂詞都包括-updir -downdir
本身的遞歸使用。
此外, -downdir
開銷幾乎為 0,而-updir
透過快取最近的匹配項使搜尋速度更快。
更多修飾符包括-prunemod
、 -quitmod
和-not
。前任:
# Find bin/gcc*
orient / -updir -name " gcc* " -a -executable
# Find bin/gcc* or bin/clang*
orient / -updir ( -name " gcc* " -o -name " clang* " ) -a -executable
# Find git repositories, first level only
orient / -downdir ( -name .git -a -type d ) -a -prune
# Must use -exec test on find and is extremely slow
find .. -type d -a -exec test -d ' {}/.git ' ; -a -print -a -prune
# .cc files under src directory of a git repository
orient / -updir ( -name src -a -updir -downdir -name .git ) -name " *.cc "
由於該應用程式是 CLI,因此只需獲取系統的可執行檔即可運行。
在 Linux 上,
-user -nouser -group -nogroup
需要 glibc 才能運作。
不幸的是,由於我沒有這樣的機器,所以缺少 macOS ARM 版本?請隨意報告它是否適用於問題或討論。
目前這個應用程式測試太少,無法發佈到發行版。
順便說一句,可能會首先發佈到 Arch AUR。
建議在發布的早期階段從原始碼建置。試一試吧! ( v0.4.0
必需)
或者更好的是,同時建構orient
和 SearchEverywhere。透過建構SearchEverywhere
, orient
也隨之建構起來。建構依賴關係:
除了CMake
之外,所有依賴項都可以由 CMake 自動下載。
如果您已經透過切換下面的這些設定選項將其中一些安裝到您的系統上,那麼也可以使用已安裝的選項。
配置選項:
ORIE_TEST
:建立 GoogleTest 測試套件ORIE_SYSTEM_PCRE2
:使用系統 PCRE2 函式庫而不是編譯新的函式庫。ORIE_LINK_STATIC
:靜態連結定向可執行文件ORIE_SYSTEM_RAPIDFUZZ
:使用系統rapidfuzz函式庫(僅限標頭)將下面的OPTION
替換為您啟用的選項,然後執行以下命令:
git clone https://github.com/cxxsucks/orient.git
cd orient ; mkdir build ; cd build
cmake -DOPTION1=ON -DOPTION2=ON -DCMAKE_BUILD_TYPE=Release ..
make -j $( nproc )
sudo make install
預設配置產生對一些起始點進行硬編碼,並在所有起始點上啟用多執行緒讀取,這對於旋轉硬碟來說不是最佳選擇。
如果您碰巧使用 HDD,請在第一次執行orient
時執行以下操作:
orient -updatedb
Ctrl-C
立即中斷~/.config/orie/default.txt
或%APPDATA%.oriedefault.txt
ROOT
之後的路徑,如果這些路徑中的任何一個實際上不在 SSD 上,則刪除SSD
欄位。ROOT "/path/to/mountpoint"
或乾脆不使用IGNORED "/path/to/mountpoint"
對其進行索引。在 Linux 上, /sys/block/sda/queue/rotational
提供了有關磁碟是否可旋轉的信息,不幸的是(但在意料之中)macOS 和 Windows 沒有這一功能。
在未來的版本中,將從/etc/mtab
和/sys/.../rotational
取得根點,它們會在 Linux 和 macOS 上自動配置根路徑。
蘋果太酷了!他們的 Macbook 必須配備世界上最好的硬碟,而且絕對不是旋轉的!
exec
系列謂詞已在 Windows 上實現,但未經測試。
適量的軟體工程經驗會告訴我們,未經測試的功能即使不是完全失敗,也肯定會包含錯誤。
有許多未經測試的功能,Windows 上的exec
是功能清單中實際列出的唯一功能。
其他未測試的功能列在 TODO 列表中,但未列出功能列表,並附有未測試的原因。
find
功能主要是全域選項:
-context
(SELinux 上下文)-printf -fprintf -ls -fls
(格式列印)-newerXY
-mindepth
-maxdepth
-H -L -P
(全域選項後面的符號連結)-D
(調試選項)-O
(最佳化等級)
orient
有自己的優化器,類似find -O3
-regextype
(硬編碼PCRE2)-warn -nowarn
-d -depth
(深度優先搜尋)
orient
只能根據索引進行搜尋。但與find
不同,-delete
不受影響。
-files0-from
-mount -xdev -xautofs
(不下降到安裝位置)-help -version
文件將成為近期工作的中心。
無論如何,在此儲存庫的 GitHub Issues Tracker 中仍接受錯誤報告和功能請求。
有關詳細信息,請參閱待辦事項清單。
dirent
到 Windows 的端口這裡對符號連結和(假)設備、套接字支援進行了大量修改,因此它直接放入原始碼而不是模組中。