定位與查找:彼此的用法,優缺點
在 Linux 和 Unix 系統中,有兩個常見的搜尋命令:
locate
和find
.各自的優缺點是什麼?當一個人比另一個人有好處?
locate(1)
只有一個很大的優勢find(1)
:速度。
find(1)
, 但是, 有很多優點locate(1)
:
find(1)
是原始的,可以追溯到 AT&T Unix 的第一個版本。您甚至可以通過 Busybox在精簡的嵌入式 Linux 中找到它。這幾乎是普遍的。
locate(1)
比find(1)
。最早的祖先locate(1)
直到 1983 年才出現,直到 1994 年它才被廣泛使用locate
,當時它被GNU findutils和4.4BSD採用。
locate(1)
也是nonstandard,因此預設情況下不會在任何地方安裝它。一些 POSIX 類型的作業系統甚至不提供它作為選項,並且在它可用的情況下,實現可能缺少您想要的功能,因為沒有獨立的標準指定必須可用的最小功能集。有一個事實上的標準,即BSD
locate(1)
,但這只是因為其他兩種主要風格locate
實現了它的所有選項:-0
,-c
,-d
,-i
,-l
,-m
,-s
和-S
.mlocate
實現了 BSD 中沒有的 6 個附加選項locate
:-b
、-e
、-P
、-q
和. GNU實現了這六個加上另外四個:、、、和。(我忽略了別名和細微差別,例如vs vs 。)--regex``-w
locate
-A``-D``-E``-p``-?``-h``--help
BSD和 Mac OS X 提供 BSD
locate
。大多數 Linux 都提供 GNU
locate
,但 Red Hat Linux 和 Archmlocate
代替。Debian 不會在其基本安裝中安裝這兩個版本,但在其預設軟體包儲存庫中提供這兩個版本;如果兩者都同時安裝,“locate
”執行mlocate
。自 2014 年 12 月發布的11.2 以來, Oracle 一直
mlocate
在 Solaris中發布。在此之前,預設情況下未在 Solaris 上安裝。(據推測,這樣做是為了減少 Solaris 與 Oracle Linux 的命令不兼容,Oracle Linux基於 Red Hat Enterprise Linux ,後者也使用.)locate``mlocate
IBM AIX仍然不提供任何版本的
locate
.至少從 AIX 7.2 開始,除非您findutils
從AIX Toolbox for Linux Applications安裝 GNU 。較舊的“真正” Unix通常不包括
locate
.
find(1)
具有強大的表達式語法,具有許多功能,布爾運算符等。
find(1)
不僅可以按名稱選擇文件。它可以通過以下方式選擇:
- 年齡
- 尺寸
- 所有者
- 文件類型
- 時間戳
- 權限
- 子樹內的深度…
目前版本的
locate(1)
接受 glob 模式也是find
如此,但 BSDlocate
根本不執行正則表達式。如果您像我一樣必須使用多種機器類型,您會發現自己更喜歡過濾而不是開發對orgrep
的依賴。-r``--regex
locate
需要強大的過濾比find
因為…
find(1)
不一定要搜尋整個文件系統。您通常將它指向一個子目錄,一個包含您希望它操作的所有文件的父目錄。實現的典型行為locate(1)
是噴出與您的模式匹配的所有文件,將其留給grep
過濾等以將其爆發縮小到一定大小。(邪惡提示:
locate /
可能會為您提供系統上所有文件的列表!)有一些
locate(1)
類似的變體slocate(1)
根據使用者權限限制輸出,但這不是locate
任何主要作業系統的預設版本。
find(1)
除了找到它們之外,它還可以對它找到的文件做*一些事情。*最強大且受廣泛支持的此類運算符是-exec
,但還有其他運算符。例如,在最近的 GNU 和 BSD find 實現中,您有-delete
and-execdir
運算符。find(1)
實時執行,因此其輸出始終是最新的。因為
locate(1)
依賴於過去幾小時或幾天更新的數據庫,所以它的輸出可能是過時的。(這是陳舊的記憶體問題。)這枚硬幣有兩個方面:
locate
可以命名不再存在的文件。GNU
locate
並且mlocate
有-e
標誌讓它在列印出它過去發現的每個文件的名稱之前檢查文件是否存在,但這會削弱一些locate
速度優勢,並且在 BSD 中不可用locate
。 2.locate
將無法命名自上次數據庫更新以來創建的文件。你學會了對locate
輸出有點不信任,知道它可能是錯誤的。有一些方法可以解決這個問題,但我不知道有任何廣泛使用的實現。例如,有
rlocate
,但它似乎不適用於任何現代 Linux 核心。
find(1)
從來沒有比執行它的使用者更多的特權。因為
locate
為系統上的所有使用者提供全域服務,所以它希望它的updatedb
程序執行,root
以便它可以看到整個文件系統。這導致選擇安全問題:
- 以 root 身份執行
updatedb
,但使其輸出文件對全世界都可讀,因此locate
可以在沒有特殊權限的情況下執行。這有效地將系統中所有文件的名稱公開給所有使用者。這可能足以導致安全漏洞導致真正的問題。BSD
locate
在 Mac OS X 和 FreeBSD 上以這種方式配置。 2. 將數據庫寫入只有 可讀root
,並設置為locate
setuid
root以便它可以讀取數據庫。這意味著locate
實際上必須重新實現作業系統的權限系統,這樣它就不會向您顯示您通常看不到的文件。它還增加了系統的攻擊面,特別是冒著根升級攻擊的風險。 3. 創建一個特殊的“locate
”使用者或組來擁有數據庫文件,並將locate
二進製文件標記setuid/setgid
為該使用者/組,以便它可以讀取數據庫。這本身並不能防止特權升級攻擊,但它大大減輕了可能造成的損害。
mlocate
在Red Hat Enterprise Linux上以這種方式配置。但是,您仍然有一個問題,因為如果您可以使用調試器
locate
或使其轉儲核心,您可以獲得數據庫的特權部分。我看不到創建真正“安全”locate
命令的方法,除非為系統上的每個使用者單獨執行它,這抵消了它相對於find(1)
.歸根結底,兩者都非常有用。
locate(1)
當您只是試圖按名稱查找特定文件時會更好,您知道該文件存在,但您只是不記得它的確切位置。find(1)
當您有一個重點領域需要檢查時,或者當您需要它的眾多優勢中的任何一個時,它會更好。