歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> Linux Find 命令精通指南

Linux Find 命令精通指南

日期:2017/3/2 9:58:48   编辑:關於Linux

Linux find 命令是所有 Linux 命令中最有用的一個,同時也是最混亂的一個。它很難,因為它的語法與其他 Linux 命令的標准語法不同。但是,它很強大,因為它允許您按文件名、文件類型、用戶甚至是時間戳查找文件。使用 find 命令,您不但可以找到具這些屬性任意組合的文件,還可以對它找到的文件執行操作。

本文的目的是,通過概述 find 命令的用途和潛能,簡化該命令的學習和使用。同時,它將針對 find 命令的某些最強大但最混亂的方面提供一個基本的指南和參考。

[注意:本文使用的 find 版本是 GNU 版本,因此,某些細節可能與其他版本的 find 有所不同。]

基本格式

開始之前,我們先來看一下 find 命令的基本結構:
find start_directory test options criteria_to_match

action_to_perform_on_results

在以下命令中,find 將開始在當前目錄(用“.”表示)中查找任何擴展名為“java”的文件:
find . -name "*.java"

下面是該命令所找到的命令的縮略清單:
find . -name "*.java"

./REGEXPvalidate/src/oracle/otnsamples/plsql/ConnectionManager.java

./REGEXPvalidate/src/oracle/otnsamples/plsql/DBManager.java

..

[注意:如果您從本文剪切並粘貼來運行該 find 命令,您可能需要使用自己的鍵盤替換雙引號 (“”) 才能得出正確的結果。]

以下命令將執行相同的操作。在這兩種情況下,您都需要對通配符進行轉義以確保它傳遞到 find 命令並且不由 shell 解釋。因此,請將您的搜索字符串放到引號裡,或者在它前面加上反斜線:
find . -name /*.java

盡管 find 的所有參數均為可選,但是如果您未指定從哪裡開始搜索,搜索默認將在當前目錄中開始。如果您不指定要匹配的測試連接、選項或值,您的結果將不完整或者無區別。

運行以下三個 find 命令將得出同樣的結果 — 當前目錄和所有子目錄中的所有文件(包括隱藏文件)的完整清單:
find

find .

find . -print

這類似於運行一個帶 -la 選項的 ls 命令。如果您希望上述命令的輸出包含完整的路徑名(或許是為了備份),您將需要指定起始目錄的完整路徑:
find /home/bluher -name /*.java

/home/bluher/plsql/REGEXPvalidate/src/oracle/otnsamples/plsql/ConnectionManager.java

/home/bluher/plsql/REGEXPvalidate/src/oracle/otnsamples/plsql/DBManager.java/

...

您還可以在搜索字符串中指定多個起始目錄。如果以具有相應權限的用戶身份運行,以下命令將下到 /usr、/home /tmp 目錄查找所有 jar 文件:
find /usr /home /tmp -name "*.jar"

但是,如果您沒有相應的權限,您在開始浏覽許多系統目錄時將生成錯誤消息。以下是一個示例:
find: /tmp/orbit-root: Permission denied

您可以通過附加您的搜索字符串來避免混亂的輸出,如下所示:
find /usr /home /tmp -name "*.jar" 2>/dev/null

這會將所有錯誤消息發送到空文件,因此提供清理器輸出。

默認情況下,find 是區分大小寫的。對於不區分大小寫的 find,將 -iname 測試替換為 -name 測試。
find downloads -iname "*.gif"

downloads/.xvpics/Calendar05_enlarged.gif

downloads/lcmgcfexsmall.GIF

除文件名外,您還可以按類型搜索文件。例如,您可以使用以下命令查找一個目錄中的所有子目錄:
find . -type d

您可以使用以下命令查找您的/usr 目錄中的所有符號鏈接:
find /usr -type l

這可能會列出 3,000 多個鏈接。以下的任何一個命令使用根權限運行都將列出 /usr 目錄中的鏈接以及它所指向的文件:
# find /usr/bin -type l -name "z*" -exec ls -l {} /;

lrwxrwxrwx 1 root root 8 Dec 12 23:17 /usr/bin/zsh -> /bin/zsh

lrwxrwxrwx 1 root root 5 Dec 12 23:17 /usr/bin/zless -> zmore

lrwxrwxrwx 1 root root 9 Dec 12 23:17 /usr/bin/zcat -> /bin/zcat
find /usr/bin -type l -name "z*" -ls

但是,第二個更短的命令將列出更多的文件,以及目錄和 inode 信息:在本文後面的部分中,我們將討論 -exec 和 -ls 操作的用法。

其他 find 可以找到的文件類型包括:

• b — 塊(緩存)特殊
• c — 字符(未緩存)特殊
• p — 命名管道 (FIFO)
• s — 套接字

使用根作為 find 命令的起點會極大地降低系統的速度。如果您必須運行這樣一個命令,您可以在非高峰時段或晚上運行它。您可以使用以下語法將輸出重定向到一個文件:
find / -print > masterfilelist.out

如果您錯誤地輸入一個 find 命令,生成大量不必要的輸出,只需按 CTRL-C 中斷該命令,這將停止最近執行的命令。

在具多個文件系統的企業網絡上,限制 find 查找的文件也是一個特別好用的方法。盡可能多地使用選項和測試以減少系統上的負載。用於此目的的兩個最有用的選項是 -xdev 和 -mount。它們通過阻止 find 下到其他文件系統(如 MS-DOS、CD-ROM 或 AFS)上的目錄中縮短了搜索范圍。這將搜索限制為同一類型的文件系統作為起始目錄。

如果運行 mount 命令,雙引導系統上的用戶可以使用這些選項。假設涉及 Windows 分區,您可以使用類似以下的命令安裝它:
mount -t vfat /dev/sda1 /mnt/msdos

您使用的實際命令取決於您的系統設置。您可以通過運行 df 或執行以下命令驗證該分區已安裝:
find /mnt/msdos -name "*.txt" 2> /dev/null

您應該看到 MS Windows 分區上列出了很多的文件。現在,運行以下帶 -mount 或 -xdev 選項的命令:
find / -name "*.txt" -mount 2> /dev/null

Copyright © Linux教程網 All Rights Reserved