在 Linux 中查詢檔案和資料夾

Niraj Menon 2023年1月30日 2022年5月11日
  1. Bash 中 find 命令的基本用法
  2. Bash 中 find 命令的高階用法
在 Linux 中查詢檔案和資料夾

當你在 Bash 命令列上並且需要在指定位置查詢特定型別的檔案或以某個名稱開頭的資料夾時,你會怎麼做?find 命令可以幫助你找到可能符合廣泛標準的檔案和資料夾,因此,它是 Linux 中功能強大的命令列實用程式。

本教程將解釋在 Bash shell 上下文中使用 find 命令,介紹基本用法、高階用例以及與其他 Bash shell 功能相結合的用法。

Bash 中 find 命令的基本用法

find 命令是一種通用工具,用於查詢從普通檔案到滿足 REGular EXpressions 的多個檔案和資料夾的任何內容。最簡單的用例,僅在當前目錄中查詢特定檔案或資料夾,可以實現如下。

find filename.ext
find foldername

執行相應命令後,如果檔案或資料夾存在,則會列印出它們的名稱。

find 命令還可以搜尋目錄,進入子目錄查詢指定的檔案或資料夾。假設我們有許多名為 test 的檔案分散在當前目錄的資料夾中。

要檢視它們的位置,我們可以鍵入以下內容。

find . -name test -type f

該程式碼應返回當前目錄和子目錄中所有名為 test 的檔案的路徑。使用引數 -type f 確保我們不會捕獲也命名為 test 的目錄 - 如果你是程式設計師,你一定會擁有許多這樣的目錄。

-name 引數是不言自明的,但如果你希望在搜尋指定名稱時不區分大小寫以捕獲諸如 tEST、Test 或 TeST 之類的名稱,我們可以使用 -iname 引數代替,其中 i 代表不敏感。

Bash glob 與 find 命令的使用沒有嚴格的關係。如果你可能不知道模式中存在哪些字元或其中有多少個字元,則可以使用位於模式中的星號。

例如,如果你想捕獲以下檔案:test、test2、test_3、testt1,你可以使用 glob 來捕獲這些短語,因為它們都以單詞 test 開頭。

以下命令執行此操作。

find . -name test*

程式碼應返回以單詞 test 開頭的任何檔案或目錄(注意刪除了 -type f 引數)。

Bash 中 find 命令的高階用法

find 命令可以擴充套件以匹配各種標準。如果你想基於多個 glob 或名稱捕獲檔案,你可能需要考慮使用 -o 或 OR 函式。

例如,如果你想在一個目錄中同時查詢 PDF 和 Word DOC/DOCX 檔案,你可以通過以下方式進行。

find -iname '*.pdf' -o -iname '*.doc' -o -iname '*.docx'

捕獲副檔名已設定為大寫的檔案的不敏感名稱引數可能是某些程式的情況。

如果你更熟悉 RegEx,你也可以使用模式來指定多個條件,使用 -regex-iregex 引數。

要捕獲與上述相同的副檔名,並另外查詢以 test 開頭的檔案,我們可以使用以下模式:

find -regex '.*/test*.\(pdf\|doc\|docx\)' -type f

對特殊的正規表示式字元(如括號和管道符號)使用反斜槓會阻止 Bash 處理它們並將整個字串直接傳遞給 find 命令以防止我們的正規表示式失敗。

最後,一些關於如何使用 find 命令輸出的討論 - 你可以通過管道輸入 wc 來計算匹配檔案和資料夾的出現次數,這是一個字元/單詞/行計數實用程式。

find -regex '.*/test*.\(pdf\|doc\|docx\)' -type f | wc -l

你可以將資料儲存到一個變數中,以便稍後在指令碼中由命令解析。

DOCS=$(find -regex '.*/test*.\(pdf\|doc\|docx\)' -type f)

請記住,檔案路徑中可能存在特殊字元,包括空格、換行符和括號,從而在將此類變數傳遞給命令時導致奇怪的行為。確保在處理此類資料時相應地設定 IFS 分隔符。

find 命令還提供類似於 xargs 操作的逐項命令執行。你可以使用 -exec 引數來實現此目的。

例如,如果你想獲得匹配的所有檔案和資料夾的許可權,可以執行以下操作:

find -regex '.*/test*.\(pdf\|doc\|docx\)' -type f -exec ls -l {} \;

相關文章 - Bash File

相關文章 - Bash Directory