教育行業(yè)A股IPO第一股(股票代碼 003032)

全國(guó)咨詢/投訴熱線:400-618-4000

Linux培訓(xùn):利用find命令在目錄中查找文件(超詳解)

更新時(shí)間:2019年04月03日09時(shí)51分 來源:傳智播客Linux培訓(xùn) 瀏覽次數(shù):

    find 是 Linux 中強(qiáng)大的搜索命令,不僅可以按照文件名搜索文件,還可以按照權(quán)限、大小、時(shí)間、inode 號(hào)等來搜索文件。但是 find 命令是直接在硬盤中進(jìn)行搜索的,如果指定的搜索范圍過大,find命令就會(huì)消耗較大的系統(tǒng)資源,導(dǎo)致服務(wù)器壓力過大。所以,在使用 find 命令搜索時(shí),不要指定過大的搜索范圍。
    find 命令的基本信息如下:
    命令名稱:find。
    英文原意:search for files in a directory hierarchy.
    所在路徑:/bin/find。
    執(zhí)行權(quán)限:所有用戶。
    功能描述:在目錄中查找文件。
linux培訓(xùn)

    命令格式

    [root@localhost ~]# find 搜索路徑 [選項(xiàng)] 搜索內(nèi)容find 是比較特殊的命令,它有兩個(gè)參數(shù):
    第一個(gè)參數(shù)用來指定搜索路徑;
    第二個(gè)參數(shù)用來指定搜索內(nèi)容。
    而且find命令的選項(xiàng)比較復(fù)雜,我們一個(gè)一個(gè)舉例來看。

    按照文件名搜索

    [root@localhost ~]#find 搜索路徑 [選項(xiàng)] 搜索內(nèi)容選項(xiàng):
    -name: 按照文件名搜索;
    -iname: 按照文件名搜索,不區(qū)分文件名大?。?inum: 按照 inode 號(hào)搜索;
    這是 find 最常用的用法,我們來試試:
    [root@localhost ~]# find /-name yum.conf
    /etc/yum.conf
    #在目錄下査找文件名是yum.conf的文件
    但是 find 命令有一個(gè)小特性,就是搜索的文件名必須和你的搜索內(nèi)容一致才能找到。如果只包含搜索內(nèi)容,則不會(huì)找到。我們做一個(gè)實(shí)驗(yàn):
    [root@localhost ~]# touch yum.conf.bak
    #在/root/目錄下建立一個(gè)文件yum.conf.bak
    [root@localhost ~]# find /-name yum.conf
    /etc/yum.conf
    #搜索只能找到y(tǒng)um.conf文件,而不能找到 yum.conf.bak 文件find 能夠找到的是只有和搜索內(nèi)容 yum.conf 一致的 /etc/yum.conf 文件,而 /root/yum.conf.bak 文件雖然含有搜索關(guān)鍵字,但是不會(huì)被找到。這種特性我們總結(jié)為:find 命令是完全匹配的,必須和搜索關(guān)鍵字一模一樣才會(huì)列出。
    Linux 中的文件名是區(qū)分大小寫的,也就是說,搜索小寫文件,是找不到大寫文件的。如果想要大小通吃,就要使用 -iname 來搜索文件。
    [root@localhost ~]# touch CANGLS
    [root@localhost ~]# touch cangls
    #建立大寫和小寫文件
    [root@localhost ~]#find.-iname cangls
    ./CANGLS
    ./cangls
    #使用-iname,大小寫文件通吃
    每個(gè)文件都有 inode 號(hào),如果我們知道 inode 號(hào),則也可以按照 inode 號(hào)來搜索文件。
    [root@localhost ~]#ls -i install.log
    262147 install.log
    #如果知道文件名,則可以用"ls -i"來査找inode號(hào)[root@localhost ~]# find.-inum 262147
    ./install.log
    #如果知道inode號(hào),則可以用find命令來査找文件按照 inode 號(hào)搜索文件,也是區(qū)分硬鏈接文件的重要手段,因?yàn)橛叉溄游募?inode 號(hào)是一致的。
    [root@localhost ~]# ln /root/install.log /tmp/#給install.log文件創(chuàng)建一個(gè)硬鏈接文件
    [root@localhost ~]#ll -i /root/install.log /tmp/install.log262147 -rw-r--r--.2 root root 24772 1 月 14 2014/root/install.log
    262147 -rw-r--r--.2 root root 24772 1 月 14 2014/tmp/install.log
    #可以看到這兩個(gè)硬鏈接文件的inode號(hào)是一致的[root@localhost ~]# find /-inum 262147
    /root/install.log
    /tmp/install.log
    #如果硬鏈接不是我們自己建立的,則可以通過find命令搜索inode號(hào),來確定硬鏈接文件按照文件大小搜索
    [root@localhost ~]#find 搜索路徑 [選項(xiàng)] 搜索內(nèi)容選項(xiàng):
    -size[+-]大小:按照指定大小搜索文件
    這里的"+"的意思是搜索比指定大小還要大的文件,"-" 的意思是搜索比指定大小還要小的文件。我們來試試:
    [root@localhost ~]# ll -h install.log
    -rw-r--r--.1 root root 25K 1月 14 2014 install.log #在當(dāng)前目錄下有一個(gè)大小是25KB的文件[root@localhost ~]#
    [root@localhost ~]# find.-size 25k
    ./install.log
    #當(dāng)前目錄下,査找大小剛好是25KB的文件,可以找到[root@localhost ~]# find .-size -25k
    .
    ./.bashrc
    ./.viminfo
    ./.tcshrc
    ./.pearrc
    ./anaconda-ks.cfg
    ./test2
    ./.ssh
    ./.bash_history
    ./.lesshst
    ./.bash_profile
    ./yum.conf.bak
    ./.bashjogout
    ./install.log.syslog
    ./.cshrc
    ./cangls
    #搜索小于25KB的文件,可以找到很多文件
    [root@localhost ~]# find.-size +25k
    #而當(dāng)前目錄下沒有大于25KB的文件
    其實(shí) find 命令的 -size 選項(xiàng)是筆者個(gè)人覺得比較惡心的選項(xiàng),為什么這樣說?find 命令可以按照 KB 來搜索,應(yīng)該也可以按照 MB 來搜索吧。
    [root@localhost ~]# find.-size -25m
    find:無效的-size類型"m"
    #為什么會(huì)報(bào)錯(cuò)呢?其實(shí)是因?yàn)槿绻凑誐B來搜索,則必須是大寫的M這就是糾結(jié)點(diǎn),千字節(jié)必須是小寫的"k",而兆字節(jié)必領(lǐng)是大寫的"M"。有些人會(huì)說:"你別那么執(zhí)著啊,你就不能不寫單位,直接按照字節(jié)搜索???"很傻,很天真,不寫單位,你們就以為會(huì)按照字節(jié)搜索嗎?我們來試試:
    [root@localhost ~]# ll anaconda-ks.cfg
    -rw-------.1 root root 1207 1 月 14 2014 anaconda-ks.cfg#anaconda-ks.cfg文件有1207字芳
    [root@localhost ~]# find.-size 1207
    #但用find查找1207,是什么也找不到的
    也就是說,find 命令的默認(rèn)單位不是字節(jié)。如果不寫單位,那么 find 命令是按照 512 Byte 來進(jìn)行査找的。 我們看看 find 命令的幫助。
    [root@localhost ~]# man find
    -size n[cwbkMG]
    File uses n units of space. The following suffixes can be used:
    'b' for 512-byte blocks (this is the default if no suffix is used)#這是默認(rèn)單位,如果單位為b或不寫單位,則按照 512Byte搜索'c' for bytes
    #搜索單位是c,按照字節(jié)搜索
    'w' for two-byte words
    #搜索單位是w,按照雙字節(jié)(中文)搜索
    'k'for Kilobytes (units of 1024 bytes)
    #按照KB單位搜索,必須是小寫的k
    'M' for Megabytes (units of 1048576 bytes)#按照MB單位搜索,必須是大寫的M
    'G' for Gigabytes (units of 1073741824 bytes)#按照GB單位搜索,必須是大寫的G
    也就是說,如果想要按照字節(jié)搜索,則需要加搜索單位"c"。我們來試試:
    [root@localhost ~]# find.-size 1207c
    ./anaconda-ks.cfg
    #使用搜索單位c,才會(huì)按照字節(jié)搜索

    按照修改時(shí)間搜索

    Linux 中的文件有訪問時(shí)間(atime)、數(shù)據(jù)修改時(shí)間(mtime)、狀態(tài)修改時(shí)間(ctime)這三個(gè)時(shí)間,我們也可以按照時(shí)間來搜索文件。
    [root@localhost ~]# find搜索路徑 [選項(xiàng)] 搜索內(nèi)容選項(xiàng):
    -atime [+-]時(shí)間: 按照文件訪問時(shí)間搜索
    -mtime [+-]時(shí)間: 按照文改時(shí)間搜索
    -ctime [+-]時(shí)間: 按照文件修改時(shí)間搜索
    這三個(gè)時(shí)間的區(qū)別我們?cè)?stat 命令中已經(jīng)解釋過了,這里用 mtime 數(shù)據(jù)修改時(shí)間來舉例,重點(diǎn)說說 "[+-]"時(shí)間的含義。
    -5:代表@內(nèi)修改的文件。
    5:代表前5~6天那一天修改的文件。
    +5:代表6天前修改的文件。
    我們畫一個(gè)時(shí)間軸,來解釋一下:
find
    每次筆者講到這里,"-5"代表 5 天內(nèi)修改的文件,而"+5"總有人說代表 5 天修改的文件。要是筆者能知道 5 天系統(tǒng)中能建立什么文件,早就去買彩票了,那是未卜先知??!所以"-5"指的是 5 天內(nèi)修改的文件,"5"指的是前 5~6 天那一天修改的文件,"+5"指的是 6 天前修改的文件。我們來試試:
    [root@localhost ~]#find.-mtime -5
    #查找5天內(nèi)修改的文件
    大家可以在系統(tǒng)中把幾個(gè)選項(xiàng)都試試,就可以明白各選項(xiàng)之間的差別了。
    find 不僅可以按照 atmie、mtime、ctime 來査找文件的時(shí)間,也可以按照 amin、mmin 和 cmin 來査找文件的時(shí)間,區(qū)別只是所有 time 選項(xiàng)的默認(rèn)單位是天,而 min 選項(xiàng)的默認(rèn)單位是分鐘。
    按照權(quán)限搜索
    在 find 中,也可以按照文件的權(quán)限來進(jìn)行搜索。權(quán)限也支持 [+/-] 選項(xiàng)。我們先看一下命令格式。
    [root@localhost ~]# find 搜索路徑 [選項(xiàng)] 搜索內(nèi)容選項(xiàng):
    -perm 權(quán)限模式:査找文件權(quán)限剛好等于"權(quán)限模式"的文件-perm -權(quán)限模式:査找文件權(quán)限全部包含"權(quán)限模式"的文件-perm +權(quán)限模式:査找文件權(quán)限包含"權(quán)限模式"的任意一個(gè)權(quán)限的文件為了便于理解,我們要舉幾個(gè)例子。先建立幾個(gè)測(cè)試文件。
    [root@localhost ~]# mkdir test
    [root@localhost ~]# cd test/
    [root@localhost test]# touch testl
    [root@localhost test]# touch test2
    [root@localhost test]# touch test3
    [root@localhost test]# touch test4
    #建立測(cè)試目錄,以及測(cè)試文件
    [root@localhost test]# chmod 755 testl
    [root@localhost test]# chmod 444 test2
    [root@localhost test]# chmod 600 test3
    [root@localhost test]# chmod 200 test4
    #設(shè)定實(shí)驗(yàn)權(quán)限。因?yàn)槭菍?shí)驗(yàn)權(quán)限,所以看起來比較別扭[root@localhost test]# ll
    總用量0
    -rwxr-xr-x 1 root root 0 6月 17 11:05 testl -r--r--r-- 1 root root 0 6月 17 11:05 test2-rw------- 1 root root 0 6月 17 11:05 test3-w------- 1 root root 0 6月 17 11:05 test4#查看權(quán)限
    【例 1】"-perm權(quán)限模式"。
    這種搜索比較簡(jiǎn)單,代表査找的權(quán)限必須和指定的權(quán)限模式一模一樣,才可以找到。
    [root@localhost test]#find.-perm 444
    ./test2
    [root@localhost test]#find.-perm 200
    ./test4
    #按照指定權(quán)限搜索文件,文件的權(quán)限必須和搜索指定的權(quán)限一致,才能找到【例 2】"-perm-權(quán)限模式"。
    如果使用"-權(quán)限模式",是代表的是文件的權(quán)限必須全部包含搜索命令指定的權(quán)限模式,才可以找到。
    [root@localhost test]#find .-perm -200
    ./test4 <-此文件權(quán)限為200
    ./test3 <-此文件權(quán)限為600
    ./testl <-此文件權(quán)限為755
    #搜索文件的權(quán)限包含200的文件,不會(huì)找到test2文件,因?yàn)閠est2的權(quán)限為444,不包含200權(quán)限因?yàn)?test4 的權(quán)限 200(-w-------)、test3 的權(quán)限 600(-rw-------)和 test1 的權(quán)限 755(-rwxr-xr-x) 都包含 200(--w-------) 權(quán)限,所以可以找到;而 test2 的權(quán)限是 444 (-r--r--r--),不包含 200 (--w-------)權(quán)限,所以找不到,再試試:
    [root@localhost test]# find .-perm -444
    .
    ./test2 <-此文件權(quán)限為444
    ./test1 <-此文件權(quán)限為755
    #搜索文件的權(quán)限包含444的文件
    上述搜索會(huì)找到 test1 和 test2,因?yàn)?test1 的權(quán)限 755 (-rwxr-xr-x)和 test2 的權(quán)限 444 (-r--r--r--)都完全包含 444 (-r--r--r--)權(quán)限,所以可以找到;而 test3 的權(quán)限 600 (-rw-------)和 test4 的權(quán)限 200 (-w-------)不完全包含 444 (-r--r--r--) 權(quán)限,所以找不到。也就是說,test3 和 test4 文件的所有者權(quán)限雖然包含 4 權(quán)限,但是所屬組權(quán)限和其他人權(quán)限都是 0,不包含 4 權(quán)限,所以找不到,這也是完全包含的意義。
    【例 3】"-perm+權(quán)限模式"
    剛剛的"-perm-權(quán)限模式"是必須完全包含,才能找到;而"-perm+權(quán)限模式"是只要包含任意一個(gè)指定權(quán)限,就可以找到。我們來試試:
    [root@localhost test]# find .-perm +444
    ./test4 <-此文件權(quán)限為200
    ./test3 <-此文件權(quán)限為600
    ./testl <-此文件權(quán)限為755
    #搜索文件的權(quán)限包含200的文件,不會(huì)找到test2文件,因?yàn)閠est2的權(quán)限為444,不包含200權(quán)限。
    因?yàn)?test4 的權(quán)限 200 (--w-------)、test3 的權(quán)限 600 (-rw-------)和 test1 的權(quán)限 755 (-rwxr-xr-x)都包含 200(--w-------)權(quán)限,所以可以找到;而 test2 的權(quán)限是 444 (-r--r--r--),不包含 200 (--w-------)權(quán)限,所以找不到。

    按照所有者和所屬組搜索

    [root@localhost ~]# find 搜索路徑 [選項(xiàng)] 搜索內(nèi)容選項(xiàng):
    -uid 用戶 ID:按照用戶 ID 査找所有者是指定 ID 的文件-gid 組 ID:按照用戶組 ID 査找所屬組是指定 ID 的文件-user 用戶名:按照用戶名査找所有者是指定用戶的文件-group 組名:按照組名査找所屬組是指定用戶組的文件-nouser:査找沒有所有者的文件
    這組選項(xiàng)比較簡(jiǎn)單,就是按照文件的所有者和所屬組來進(jìn)行文件的査找。在 Linux 系統(tǒng)中,絕大多數(shù)文件都是使用 root 用戶身份建立的,所以在默認(rèn)情況下,絕大多數(shù)系統(tǒng)文件的所有者都是 root。例如:
    [root@localhost ~]#find.-user root
    #在當(dāng)前目錄中査找所有者是 root 的文件
    由于當(dāng)前目錄是 root 的家目錄,所有文件的所有者都是 root 用戶,所以這條搜索命令會(huì)找到當(dāng)前目錄下所有的文件。
    按照所有者和所屬組搜索時(shí),"-nouser"選項(xiàng)比較常用,主要用于査找垃圾文件。在 Linux 中,所有的文件都有所有者,只有一種情況例外,那就是外來文件。比如光盤和 U 盤中的文件如果是由 Windows 復(fù)制的,在 Linux 中査看就是沒有所有者的文件;再比如手工源碼包安裝的文件,也有可能沒有所有者。
    除這種外來文件外,如果系統(tǒng)中發(fā)現(xiàn)了沒有所有者的文件,一般是沒有作用的垃圾文件(比如用戶刪除之后遺留的文件),這時(shí)需要用戶手工處理。搜索沒有所有者的文件,可以執(zhí)行以下命令:
    [root@localhost ~]# find/-nouser

    按照文件類型搜索

    [root@localhost ~]# find 搜索路徑 [選項(xiàng)] 搜索內(nèi)容選項(xiàng):
    -type d:查找目錄
    -type f:查找普通文件
    -type l:查找軟鏈接文件
    這個(gè)命令也很簡(jiǎn)單,主要按照文件類型進(jìn)行搜索。在一些特殊情況下,比如需要把普通文件和目錄文件區(qū)分開,比如需要把普通文件和目錄文件區(qū)分開,使用這個(gè)選項(xiàng)就很方便。
    [root@localhost ~]# find /etc -type d
    #查找/etc/目錄下有哪些子目錄

    邏輯運(yùn)算符

    [root@localhost ~]#find 搜索路徑 [選項(xiàng)] 搜索內(nèi)容選項(xiàng):
    -a:and邏輯與
    -o:or邏輯或
    -not:not邏輯非

    1) -a:and邏輯與

    find 命令也支持邏輯運(yùn)算符選項(xiàng),其中 -a 代表邏輯與運(yùn)算,也就是 -a 的兩個(gè)條件都成立,find 搜索的結(jié)果才成立。
    舉個(gè)例子:
    [root@localhost ~]# find.-size +2k -a -type f#在當(dāng)前目錄下搜索大于2KB,并且文件類型是普通文件的文件在這個(gè)例子中,文件既要大于 2KB,又必須是普通文件,find 命令才可以找到。再舉個(gè)例子:
    [root@localhost ~]# find.-mtime -3 -a -perm 644#在當(dāng)前目錄下搜索3天以內(nèi)修改過,并且權(quán)限是644的文件2) -o:or邏輯或
    -o 選項(xiàng)代表邏輯或運(yùn)算,也就是 -o 的兩個(gè)條件只要其中一個(gè)成立,find 命令就可以找到結(jié)果。例如:
    [root@localhost ~]#find.-name cangls -o -name bols./cangls
    ./bols
    #在當(dāng)前目錄下搜索文件名要么是cangls的文件,要么是bols的文件-o 選項(xiàng)的兩個(gè)條件只要成立一個(gè),find 命令就可以找到結(jié)果,所以這個(gè)命令既可以找到 cangls 文件,也可以找到 bols 文件。

    3) -not:not邏輯非

    -not是邏輯非,也就是取反的意思。舉個(gè)例子:
    [root@localhost ~]# find.-not -name cangls#在當(dāng)前目錄下搜索文件名不是cangls的文件
    其他選項(xiàng)

    1) -exec選項(xiàng)

    這里我們主要講解兩個(gè)選項(xiàng)"-exec"和"-ok",這兩個(gè)選項(xiàng)的基本作用非常相似。我們先來看看 "exec"選項(xiàng)的格式。
    [root@localhost ~]# find 搜索路徑 [選項(xiàng)] 搜索內(nèi)容 -exec 命令2{}\;首先,請(qǐng)大家注意這里的"{}"和"\;"是標(biāo)準(zhǔn)格式,只要執(zhí)行"-exec"選項(xiàng),這兩個(gè)符號(hào)必須完整輸入。
    其次,這個(gè)選項(xiàng)的作用其實(shí)是把 find 命令的結(jié)果交給由"-exec"調(diào)用的命令 2 來處理。"{}"就代表 find 命令的査找結(jié)果。
    我們舉個(gè)例子,剛剛在講權(quán)限的時(shí)候,使用權(quán)限模式搜索只能看到文件名,例如:
    [root@localhost test]#find.-perm 444
    ./test2
    如果要看文件的具體權(quán)限,還要用"ll"命令査看。用"-exec"選項(xiàng)則可以一條命令搞定:
    [root@localhost test]# find.-perm 444 -exec ls -l {}\;-r--r--r-- 1 root root 0 6月 17 11:05 ./test2#使用"-exec"選項(xiàng),把find命令的結(jié)果直接交給"ls -l"命令處理"-exec"選項(xiàng)的作用是把 find 命令的結(jié)果放入"{}"中,再由命令 2 直接處理。在這個(gè)例子中就是用"ls -l"命令直接處理,會(huì)使 find 命令更加方便。

    2) -ok選項(xiàng)

    "-ok"選項(xiàng)和"-exec"選項(xiàng)的作用基本一致,區(qū)別在于:"-exec"的命令會(huì)直接處理,而不詢問;"-ok"的命令 2 在處理前會(huì)先詢問用戶是否這樣處理,在得到確認(rèn)命令后,才會(huì)執(zhí)行。例如:
    [root@localhost test]# find .-perm 444 -ok rm -rf{}\;<rm…./test2>?y  <-需要用戶輸入y,才會(huì)執(zhí)行#我們這次使用rm命令來刪除find找到的結(jié)果,刪除的動(dòng)作最好確認(rèn)一下
》》》傳智播客linux培訓(xùn)班,帶你從新手到大神,咨詢右下角窗口咨詢開班時(shí)間《《《
傳智播客linux培訓(xùn)
0 分享到:
和我們?cè)诰€交談!