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