天天看點

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

未來已來,隻是不均衡地分布在當下

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

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

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

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

在本篇中我們将掌握

兩款用于在系統中查找檔案的工具

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

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

  • xargs:通過标準輸入建構并執行指令
  • touch:修改檔案時間
  • stat:顯示檔案或檔案系統狀态

一、查找工具

1. locate

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

場景1

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

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

locate 指令會從 路徑名資料庫 中進行查找,輸出所有包含字元串 locate-file 的比對項。

場景2

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

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

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

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

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

兩個步驟:

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

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

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

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

2. find

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

場景1

我們想要生成 testdir 目錄中的檔案清單,那該怎麼辦?通過 find 指令

對于相對較大的檔案夾來說,該指令會産生一個很長的檔案清單,我們可以利用 **管道 | ** 的特性進行二次處理。比如我們可以通過 wc 指令來統計檔案數量。

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

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

1)測試條件

假如我們隻想要查找目錄,我們便可以利用測試條件來實作。

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

通過加入測試條件 -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 來檢視指令手冊

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

2)操作符

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

場景1

我想查找 testdir 目錄下,命名為 dir2 和 dir3 的檔案

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

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

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

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

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

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

三個邏輯關系:與、或、非。介紹了前兩種,第三種也不能落下:

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

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

3)預定義操作

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

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

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

然後使用 -delete 指令來删除目前比對的檔案

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

可以發現, /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做架構的程式猿吧~ 咱們下文再見!

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

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

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