一文揭曉,我是如何在Linux中查詢自如

菜農曰發表於2023-01-29

未來已來,只是不均衡地分佈在當下

大家好,我是菜農,歡迎來到我的頻道。

本文共 2187字,預計閱讀 10 分鐘

用過 Linux 的小夥伴都知道,在Linux系統中包含著大量的檔案,絕大部分情況下,我們都是透過 CLI 的方式與Linux進行互動,這就會面臨一個問題,當我們需要查詢一個檔案的時候卻遲遲無從下手,不知道該如何找起。

我們應該怎麼查詢檔案呢?龐大的檔案量如何查詢自如了,這篇文章帶你走進 Linux 的內部世界!

在本篇中我們將掌握

兩款用於在系統中查詢檔案的工具

  • locate:按照路徑名查詢檔案
  • find:在目錄中查詢檔案

三個配合查詢工具來處理結果檔案的命令

  • xargs:透過標準輸入構建並執行命令
  • touch:修改檔案時間
  • stat:顯示檔案或檔案系統狀態

一、查詢工具

1. locate

顧名思義,這是一款定位工具,用於簡單的檔案查詢。它能對路徑名執行快速的資料庫查詢(留意下,這裡是 資料庫 查詢),然後輸出與給定字串匹配的各個名稱。

場景1

系統中建立了一個 locate-file 檔案,由於粗心忘記了檔案所在路徑,那該怎麼辦呢?透過 locate 命令

locate 命令會從 路徑名資料庫 中進行查詢,輸出所有包含字串 locate-file 的匹配項。

場景2

難度升級,在系統的多個目錄下都建立了 locate-file 檔案,但只想要上級目錄是 dir1 的檔案,那該怎麼辦?透過 grep 命令

我們可以藉助Linux系統中 管道 | 的特性,利用 grep 來進行過濾。

不知道細心的小夥伴有沒有注意到,上面幾段文字中都提到了 資料庫 這個關鍵詞。我們利用 locate 再次進行查詢:

兩個步驟:

  1. 我們建立了 locate-file_bak 檔案
  2. 我們利用 locate 進行查詢

但我們卻發現此時查詢的結果為空!locate 難道失效了?其實不然,locate 命令在系統安裝好之後是無法工作的,但如果我們過一天後再次進行嘗試就會發現又恢復正常了。那是咋回事?是因為 locate 命令的資料庫是透過另一個命令 updatedb 建立的。它通常利用 cron 定時任務進行作業,大多數包含 locate 命令的系統每天會執行一次 updatedb 命令,因此資料庫並不是實時更新的,所以會出現上述的情況,建立檔案後,資料庫還沒進行更新。

那麼該如何解決該問題呢?

我們可以切換為超級使用者,手動執行 updatedb 命令。

2. find

顧名思義,這也是一款定位工具,不同的是,該命令使用者複雜的檔案查詢。find 命令可以根據各種屬性在指定目錄(及其子目錄)中查詢檔案。

場景1

我們想要生成 testdir 目錄中的檔案列表,那該怎麼辦?透過 find 命令

對於相對較大的資料夾來說,該命令會產生一個很長的檔案列表,我們可以利用 管道 | 的特性進行二次處理。比如我們可以透過 wc 命令來統計檔案數量。

find 命令的強大之處就是在於能夠配合各種選項(option)、測試條件(test)以及操作(action)來找出符合特定條件的檔案。

1)測試條件

假如我們只想要查詢目錄,我們便可以利用測試條件來實現。

透過加入測試條件 -type d,限制只查詢目錄。相反,我們也可以使用下列測試條件,限制只查詢普通檔案

透過 type 可以來限制輸出的檔案型別,在 find 命令中支援以下檔案型別:

  • b: 塊裝置檔案
  • c: 字元裝置檔案
  • d: 目錄
  • f: 普通檔案
  • l: 符號連結

當然,我們除了利用 -type 來限制檔案的型別,我們還可以限制 檔名、檔案大小 等,以下列出幾點常見的測試條件:

  • -size n: 匹配大小為 n 的檔案
  • -type n: 匹配型別為 n 的檔案
  • -name n: 匹配名稱為 n 的檔案
  • -empty: 匹配空檔案或目錄
  • -user name: 匹配屬於使用者 name 的檔案或目錄。name 可以使用使用者名稱或數值形式的使用者ID表示

如果想檢視更完整的測試條件,可以使用 man find 來檢視命令手冊

2)運算子

測試條件find 指令已經相當完整了,但有些時候我們仍然需要一種更好的方式來描述測試條件之間的邏輯關係。

場景1

我想查詢 testdir 目錄下,命名為 dir2dir3 的檔案

這很明顯是一種 的邏輯,使用 find 命令我們可以這樣做:

在這一小段語句中我們使用到了兩種邏輯關係:分別是 且(-and)或(-or)

-and 可以省略,如果不嫌麻煩的話也可以這樣寫:

三個邏輯關係:。介紹了前兩種,第三種也不能落下:

透過指令可以看出,我們可以利用 -not 進行結果取反。

3)預定義操作

以上操作我們能夠透過 find 命令來查詢結果,但更多時候我們真正想做的是對結果執行某些特殊操作。

當我們想要刪除 /Users/cbuc/testdir/dir2 這個目錄時,我們可以透過以上認識到的操作先進行查詢

然後使用 -delete 命令來刪除當前匹配的檔案

可以發現, /Users/cbuc/testdir/dir2 這個目錄已經被刪除了

除了刪除操作,還可以進行以下幾種常見的操作:

  • -delete: 刪除當前匹配的檔案
  • -ls: 對匹配的檔案執行相當於 ls -dils 命令的操作
  • -print: 將匹配檔案的完整路徑名輸出至標準輸出
  • -quit: 一旦發現匹配就退出
敬畏生產環境:使用 -delete 之前,需要使用 -print 命令先確保查詢結果無誤。

4)自定義操作

除了預定義操作,我們還可以針對查詢結果呼叫任意命令。傳統的實現方式是透過 -exec 操作。

-exec command {};

這裡的 command 特指命令名,{ } 是代表當前路徑名的符號。; 作為分隔符,表示命令結束。比如我們之前使用的 -delete 命令可以使用自定義操作來替換。

-exec rm '{}' ';'

因為 { }; 對 shell 具有特殊的含義,所以必須對其進行標註或轉義

我們藉此來認識 xargs 命令,它從標準輸入接收輸入,將其轉換為指定命令的引數列表。

其中,find 命令的輸出結果透過管道傳給了 xargs 命令,後者構造出 ls 命令的引數列表,然後執行該命令。

命令引數的數量不是沒有限制的。有可能出現命令長度超出 Shell 接受能力的情況。如果出現了這種情況,xargs 命令可以使用系統支援的最大引數數量來執行指定的命令,然後重複此過程,直至處理完所有引數。在執行 xargs 命令時加入 --show-limits 選項就能知道系統支援的最大引數數量。

好了,以上便是本篇的所有內容,如果覺得對你有幫助的小夥伴不妨點個關注做個伴,便是對小菜最大的支援。不要空談,不要貪懶,和小菜一起做個吹著牛X做架構的程式猿吧~ 我們們下文再見!

今天的你多努力一點,明天的你就能少說一句求人的話!

我是小菜,一個和你一起變強的男人。 ?

微信公眾號已開啟,菜農曰,沒關注的同學們記得關注哦!

相關文章