時間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評論(4)
Linux find 命令是所有 Linux 命令中最有用的一個,同時也是最混亂的一個。它很難,因為它的語法與其他 Linux 命令的標準語法不同。但是,它很強大,因為它允許您按文件名、文件類型、用戶甚至是時間戳查找文件。使用 find 命令,您不但可以找到具這些屬性任意組合的文件,還可以對它找到的文件執(zhí)行操作。
本文的目的是,通過概述 find 命令的用途和潛能,簡化該命令的學習和使用。同時,它將針對 find 命令的某些最強大但最混亂的方面提供一個基本的指南和參考。
[注意:本文使用的 find 版本是 GNU 版本,因此,某些細節(jié)可能與其他版本的 find 有所不同。]
基本格式
開始之前,我們先來看一下 find 命令的基本結(jié)構:
find?? start_directory? test? options?? criteria_to_matchaction_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 命令,您可能需要使用自己的鍵盤替換雙引號 ("") 才能得出正確的結(jié)果。]
以下命令將執(zhí)行相同的操作。在這兩種情況下,您都需要對通配符進行轉(zhuǎn)義以確保它傳遞到 find 命令并且不由 shell 解釋。因此,請將您的搜索字符串放到引號里,或者在它前面加上反斜線:
find . -name? \*.java
盡管 find 的所有參數(shù)均為可選,但是如果您未指定從哪里開始搜索,搜索默認將在當前目錄中開始。如果您不指定要匹配的測試連接、選項或值,您的結(jié)果將不完整或者無區(qū)別。
運行以下三個 find 命令將得出同樣的結(jié)果 — 當前目錄和所有子目錄中的所有文件(包括隱藏文件)的完整清單:
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"
但是,如果您沒有相應的權限,您在開始瀏覽許多系統(tǒng)目錄時將生成錯誤消息。以下是一個示例:
find:? /tmp/orbit-root: Permission denied
您可以通過附加您的搜索字符串來避免混亂的輸出,如下所示:
find /usr /home? /tmp -name "*.jar" 2>/dev/null
這會將所有錯誤消息發(fā)送到空文件,因此提供清理器輸出。
默認情況下,find 是區(qū)分大小寫的。對于不區(qū)分大小寫的 find,將 -iname 測試替換為 -name 測試。
find downloads? -iname "*.gif"downloads/.xvpics/Calendar05_enlarged.gifdownloads/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/zshlrwxrwxrwx 1 root? root 5 Dec 12 23:17 /usr/bin/zless -> zmorelrwxrwxrwx 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 — 套接字
#p#副標題#e#
使用根作為 find 命令的起點會極大地降低系統(tǒng)的速度。如果您必須運行這樣一個命令,您可以在非高峰時段或晚上運行它。您可以使用以下語法將輸出重定向到一個文件:
find? /?? -print > masterfilelist.out
如果您錯誤地輸入一個 find 命令,生成大量不必要的輸出,只需按 CTRL-C 中斷該命令,這將停止最近執(zhí)行的命令。
在具多個文件系統(tǒng)的企業(yè)網(wǎng)絡上,限制 find 查找的文件也是一個特別好用的方法。盡可能多地使用選項和測試以減少系統(tǒng)上的負載。用于此目的的兩個最有用的選項是 -xdev 和 -mount。它們通過阻止 find 下到其他文件系統(tǒng)(如 MS-DOS、CD-ROM 或 AFS)上的目錄中縮短了搜索范圍。這將搜索限制為同一類型的文件系統(tǒng)作為起始目錄。
如果運行 mount 命令,雙引導系統(tǒng)上的用戶可以使用這些選項。假設涉及 Windows 分區(qū),您可以使用類似以下的命令安裝它:
mount -t vfat? /dev/sda1 /mnt/msdos
您使用的實際命令取決于您的系統(tǒng)設置。您可以通過運行 df 或執(zhí)行以下命令驗證該分區(qū)已安裝:
find /mnt/msdos? -name "*.txt" 2> /dev/null
您應該看到 MS Windows 分區(qū)上列出了很多的文件。現(xiàn)在,運行以下帶 -mount 或 -xdev 選項的命令:
find / -name? "*.txt" -mount 2> /dev/null
或者
find / -name? "*.txt" -xdev 2> /dev/null
還可以使用 -fstype 測試明確告知 find 在哪個文件系統(tǒng)中查找,如以下示例中所示:
find / -name? "*.txt" -fstype vfat 2> /dev/null
查找時間
find 命令有幾個用于根據(jù)您系統(tǒng)的時間戳搜索文件的選項。這些時間戳包括
* mtime — 文件內(nèi)容上次修改時間
* atime — 文件被讀取或訪問的時間
* ctime — 文件狀態(tài)變化時間
mtime 和 atime 的含義都是很容易理解的,而 ctime 則需要更多的解釋。由于 inode 維護著每個文件上的元數(shù)據(jù),因此,如果與文件有關的元數(shù)據(jù)發(fā)生變化,則 inode 數(shù)據(jù)也將變化。這可能是由一系列操作引起的,包括創(chuàng)建到文件的符號鏈接、更改文件權限或移動了文件等。由于在這些情況下,文件內(nèi)容不會被讀取或修改,因此 mtime 和 atime 不會改變,但 ctime 將發(fā)生變化。
這些時間選項都需要與一個值 n 結(jié)合使用,指定為 -n、n 或 +n。
* -n 返回項小于 n
* +n 返回項大于 n
* n 返回項正好與 n 相等
下面,我們來看幾個例子,以便于理解。以下命令將查找在最近 1 小時內(nèi)修改的所有文件:
find . -mtime -1./plsql/FORALLSample./plsql/RegExpDNASample/plsql/RegExpSample
用 1 取代 -1 運行同一命令將查找恰好在 1 小時以前修改的所有文件:
find . -mtime 1
上述命令不會生成任何結(jié)果,因為它要求完全吻合。以下命令查找 1 個多小時以前修改的所有文件:
find . -mtime +1
默認情況下,-mtime、-atime 和 -ctime 指的是最近 24 小時。但是,如果它們前面加上了開始時間選項,則 24 小時的周期將從當日的開始時間算起。您還可以使用 mmin、amin 和 cmin 查找在不到 1 小時的時間內(nèi)變化了的時間戳。
如果您在登錄到您的帳戶后立即運行以下命令,您將找到在不到 1 分鐘以前讀取的所有文件:
find . -amin -1./.bashrc/.bash_history./.xauthj5FCx1
應該注意的是,使用 find 命令查找文件本身將更改該文件的訪問時間作為其元數(shù)據(jù)的一部分。
您還可以使用 -newer、-anewer 和 –cnewer 選項查找已修改或訪問過的文件與特定的文件比較。這類似于 -mtime、-atime 和 –ctime。
* -newer 指內(nèi)容最近被修改的文件
* -anewer 指最近被讀取過的文件
* -cnewer 指狀態(tài)最近發(fā)生變化的文件
要查找您的主目錄中自上一個 tar 文件以來以某種方式編輯過的所有文件,使用以下命令:
find . -newer? backup.tar.gz
按大小查找文件
-size 選項查找滿足指定的大小條件的文件。要查找所有大于 5MB 的用戶文件,使用
find / -size? +5000000c 2> /dev/null/var/log/lastlog/var/log/cups/access_log.4/var/spool/mail/bluher
結(jié)尾的"c"以字節(jié)為單位報告我們的結(jié)果。默認情況下,find 以 512 字節(jié)塊的數(shù)量報告大小。如果我們將"c"替換為"k",我們還會看到以千
關鍵詞標簽:Linux,Find命令
相關閱讀
熱門文章 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程 Tomcat9.0如何安裝_Tomcat9.0環(huán)境變量配置方法 多種操作系統(tǒng)NTP客戶端配置 Linux操作系統(tǒng)修改IP
人氣排行 Linux下獲取CPUID、硬盤序列號與MAC地址 dmidecode命令查看內(nèi)存型號 linux tc實現(xiàn)ip流量限制 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程 linux下解壓rar文件 lcx.exe、nc.exe、sc.exe入侵中的使用方法 Ubuntu linux 關機、重啟、注銷 命令 查看linux服務器硬盤IO讀寫負載