跳至內容

Unix/命令/查詢檔案指南

來自華夏公益教科書

在給定路徑中搜索檔案或資料夾。語法為:find [path...] [expression...]

示例: 在一些最新的類 Unix 作業系統中,-print 選項是預設的,可以省略。以下命令從根 ('/') 目錄開始搜尋檔案 'grub.conf'。

$ find / -name grub.conf
/etc/grub.conf

如果您不是計算機的管理員,您將收到對所有您無權讀取的目錄的錯誤訊息。在這種情況下,對於 bash shell,請執行以下操作

$ find / -name grub.conf 2>/dev/null
/etc/grub.conf

或者對於 csh/tcsh,請執行以下操作

$ find / -name grub.conf >& /dev/null
/etc/grub.conf

如果您想忽略字元的大小寫,可以使用 -iname。以下將找到副檔名為 txtTXTTxt 等等的檔案

$ find / -iname '*.txt' 
/home/rtm/hacking.txt
/home/bok/Documents/MyLetter.TXT
/home/bok/tmp/found.tXt

以下命令將搜尋所有名為 'local' 的目錄。

$ find / -name local -type d
/usr/X11R6/lib/X11/fonts/local
/usr/local
/var/cache/man/local
/var/local

上面的示例結合了兩個測試 - 檔名 (-name) 和檔案型別 (-type) - 並返回滿足這兩個測試的檔案(邏輯與)。

還可以指定兩個或多個測試,並使用 -o(邏輯或)指令返回滿足其中任何一個測試的檔案。要進行 OR 操作的測試必須在 (...) 之間分組(必須用 \ 轉義,因為括號對 shell 有特殊含義)。以下返回副檔名為 txtdoc 的檔案,以及大小超過 5MB(兆位元組)的任何檔案。

$ find / \( -name '*.txt' -o -name '*.doc' -o -size +5M \)
/home/rtm/hacking.txt
/home/bok/report.doc
/home/bok/backup/may.tar.bz2
/home/koppe/BiggerThan5Megs.doc

最後一個檔案滿足了兩個測試。

注意:每個指令必須完整,測試不能省略。例如,-name '*.txt' -o '*.doc'(省略第二個 -name)是無效的。

提示: 使用 'exec' 選項對 find 找到的每個檔案執行某些命令

$ find . -name '*bak' -exec rm -i {} \;
rm: remove regular empty file `./file1.bak'? y
rm: remove regular empty file `./file2.bak'? y
rm: remove regular empty file `./file3.bak'? y

使用 'ok' 的效果相同,但它會提示每個檔案

$ find . -name '*~' -ok rm {} \;
< rm ... ./RMAIL~ > ? y

警告: 當使用 "-exec" 或 "-ok" 時,必須使用分號來指示引數的結束(在示例中為 "rm")。因為分號對 shell 有特殊含義,所以必須將其引用。上面的示例用反斜槓引用分號。

連結

在正常的可執行檔案和手冊頁位置搜尋指定的檔案。似乎沒有被 POSIX 涵蓋。

示例

$ whereis ls  
ls: /bin/ls /usr/bin/ls /usr/man/man1/ls.1.gz /usr/share/man/man1/ls.1.gz

連結

在您的 PATH 變數中的位置搜尋指定的檔案。如果您知道程式在您的路徑中(即您可以執行它),這比 whereis 速度更快。

$ which pine
/usr/bin/pine

連結

查詢與指定查詢匹配的所有檔名。在傳統 UNIX 中不存在,是 GNU 軟體,並隨 Linux 標準提供。

示例

$ locate make.conf
/etc/make.conf
/etc/make.conf.orig
/etc/make.conf.example
/usr/qt/3/mkspecs/linux-g++/qmake.conf
/usr/share/man/man5/make.conf.5.gz

請注意,locate 使用的是已收集的檔名資料庫,該資料庫通常每天更新一次。因此,使用 locate 不會正確顯示新建立或刪除的檔案/目錄。

連結

將輸入流中的專案轉換為另一個命令的引數以呼叫。一個常見的用法是與 find 結合使用。

示例

  • echo a b c | xargs -n1 echo
    • 輸出 a、b 和 c,每個都單獨一行;-n1 指定最多將 1 個輸入專案傳遞給命令一次。
  • echo a,b,c | xargs -d, -n1 echo
    • 在某些版本的 GNU xargs 中,輸出 a、b 和 c,每個都單獨一行。-d 指定專案分隔符。

連結

華夏公益教科書