Files

定位與查找:彼此的用法,優缺點

  • February 13, 2019

在 Linux 和 Unix 系統中,有兩個常見的搜尋命令:locatefind.

各自的優缺點是什麼?當一個人比另一個人有好處?

locate(1)只有一個很大的優勢find(1):速度。

find(1), 但是, 有很多優點locate(1):

locate(1)find(1)。最早的祖先locate(1) 直到 1983 年才出現,直到 1994 年它才被廣泛使用locate,當時它被GNU findutils4.4BSD採用。

  • locate(1)也是nonstandard,因此預設情況下不會在任何地方安裝它。一些 POSIX 類型的作業系統甚至不提供它作為選項,並且在它可用的情況下,實現可能缺少您想要的功能,因為沒有獨立的標準指定必須可用的最小功能集。

有一個事實上的標準,即BSDlocate(1),但這只是因為其他兩種主要風格locate實現了它的所有選項:-0, -c, -d, -i, -l, -m,-s-S. mlocate實現了 BSD 中沒有的 6 個附加選項locate-b-e-P-q和. GNU實現了這六個加上另外四個:、、、和。(我忽略了別名和細微差別,例如vs vs 。)--regex``-wlocate-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 開始,除非您findutilsAIX Toolbox for Linux Applications安裝 GNU 。

HP-UX似乎也缺少locate基本系統。

較舊的“真正” Unix通常不包括locate.

  • find(1)具有強大的表達式語法,具有許多功能,布爾運算符等。

  • find(1)不僅可以按名稱選擇文件。它可以通過以下方式選擇:

    • 年齡
    • 尺寸
    • 所有者
    • 文件類型
    • 時間戳
    • 權限
    • 子樹內的深度…
  • 按名稱查找文件時,您可以使用正則表達式在所有版本或 GNU 或 BSD 版本中使用文件通配語法進行搜尋。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 實現中,您有-deleteand-execdir運算符。
  • find(1)實時執行,因此其輸出始終是最新的。

因為locate(1)依賴於過去幾小時或幾天更新的數據庫,所以它的輸出可能是過時的。(這是陳舊的記憶體問題。)這枚硬幣有兩個方面:

  1. locate可以命名不再存在的文件。

GNUlocate並且mlocate-e標誌讓它在列印出它過去發現的每個文件的名稱之前檢查文件是否存在,但這會削弱一些locate速度優勢,並且在 BSD 中不可用locate。 2. locate將無法命名自上次數據庫更新以來創建的文件。你學會了對locate輸出有點不信任,知道它可能是錯誤的。

有一些方法可以解決這個問題,但我不知道有任何廣泛使用的實現。例如,有rlocate,但它似乎不適用於任何現代 Linux 核心。

  • find(1)從來沒有比執行它的使用者更多的特權。

因為locate為系統上的所有使用者提供全域服務,所以它希望它的updatedb程序執行,root以便它可以看到整個文件系統。這導致選擇安全問題:

  1. 以 root 身份執行updatedb,但使其輸出文件對全世界都可讀,因此locate可以在沒有特殊權限的情況下執行。這有效地將系統中所有文件的名稱公開給所有使用者。這可能足以導致安全漏洞導致真正的問題。

BSDlocate在 Mac OS X 和 FreeBSD 上以這種方式配置。 2. 將數據庫寫入只有 可讀root,並設置為locate setuidroot以便它可以讀取數據庫。這意味著locate實際上必須重新實現作業系統的權限系統,這樣它就不會向您顯示您通常看不到的文件。它還增加了系統的攻擊面,特別是冒著根升級攻擊的風險。 3. 創建一個特殊的“ locate”使用者或組來擁有數據庫文件,並將locate二進製文件標記setuid/setgid為該使用者/組,以便它可以讀取數據庫。這本身並不能防止特權升級攻擊,但它大大減輕了可能造成的損害。

mlocate在Red Hat Enterprise Linux上以這種方式配置。

但是,您仍然有一個問題,因為如果您可以使用調試器locate或使其轉儲核心,您可以獲得數據庫的特權部分。我看不到創建真正“安全”locate命令的方法,除非為系統上的每個使用者單獨執行它,這抵消了它相對於find(1).

歸根結底,兩者都非常有用。locate(1)當您只是試圖按名稱查找特定文件時會更好,您知道該文件存在,但您只是不記得它的確切位置。find(1)當您有一個重點領域需要檢查時,或者當您需要它的眾多優勢中的任何一個時,它會更好。

引用自:https://unix.stackexchange.com/questions/60205