Linux之文件查找命令
Linux中常見的文件查詢命令有5個(gè)??
??which:在PATH變量指定的路徑中,搜索某個(gè)系統(tǒng)命令的位置,并且返回第一個(gè)搜索結(jié)果;
????type:用于區(qū)分某個(gè)命令到底是由shell自帶的,還是由shell外部的獨(dú)立二進(jìn)制文件提供的。如果一個(gè)命令是外部命令,那么使用-p參數(shù),會(huì)顯示該命令的路徑,相當(dāng)于which命令。type命令其實(shí)不能算查找命令;
????whereis:只能用于程序名的搜索,而且只搜索二進(jìn)制文件(參數(shù)-b)、man說(shuō)明文件(參數(shù)-m)和源代碼文件(參數(shù)-s);
????locate:相當(dāng)于find -name,可快速查找文件;
????find:最常用和最強(qiáng)大的查找命令,可以用它找到任何想找的文件。
注意:
??? 通常find不很常用,因?yàn)樗俣嚷?#xff01;
??? 常都是先使用whereis或者locate來(lái)檢查,當(dāng)真的找不到了,才用find查找。
??? 是因?yàn)閣hereis與locate是利用數(shù)據(jù)庫(kù)來(lái)查找數(shù)據(jù),所以相當(dāng)快速,而且沒(méi)有實(shí)際查詢硬盤,比較節(jié)省時(shí)間。
????whereis和locate尋找的數(shù)據(jù)是由已創(chuàng)建的數(shù)據(jù)?/var/lib/?中查找。但是數(shù)據(jù)庫(kù)的更新默認(rèn)是每天更新一次(不同系統(tǒng)可能會(huì)有差異),所以當(dāng)新建文件或刪除文件后去查找該文件,whereis和locate會(huì)告訴你文件“not found”,因?yàn)楸仨毟聰?shù)據(jù)庫(kù)了。
??? 要手動(dòng)更新數(shù)據(jù)庫(kù)的方法也很簡(jiǎn)單,直接輸入updatedb即可。updatedb命令回去讀取/etc/updatedb.conf中的配置,然后去硬盤里面進(jìn)行查找文件名操作,最后更新整個(gè)數(shù)據(jù)庫(kù)文件。
1、which命令
[root @localhost ~]#which [-a] command 參數(shù)解析: -a:將所有由PATH目錄中可以找到的目錄均列出來(lái) [root@localhost Test]# which ifconfig /sbin/ifconfig [root@localhost Test]# su - rhx [rhx@localhost ~]$ which ifxonfig /usr/bin/which: no ifxonfig in (/usr/lib/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/rhx/bin)為什么會(huì)顯示不存在呢?這是因?yàn)閣hich根據(jù)用戶所設(shè)置的PATH變量?jī)?nèi)的目錄去查找可執(zhí)行文件,所以不同的用戶所設(shè)置的PATH設(shè)置內(nèi)容就不一樣了。
2、whereis?
文件查找時(shí)優(yōu)先使用where和locate命令,當(dāng)找不到的時(shí)候才會(huì)使用find,因?yàn)閒ind命令查找速度較慢,因?yàn)閒ind命令直接查找硬盤,而whereis命令使用的查找方式不同,Linux將系統(tǒng)內(nèi)的所有文件都記錄在一個(gè)數(shù)據(jù)庫(kù)文件中,使用whereis 或者locate 命令會(huì)以此數(shù)據(jù)庫(kù)進(jìn)行查找,但是如果數(shù)據(jù)庫(kù)沒(méi)有更新,則會(huì)出現(xiàn)新建文件查詢不到的情況發(fā)生
[root @localhost ~]#where [-bmsu] command 參數(shù)解析: -b :只查找二進(jìn)制格式的文件 -m :只查找在說(shuō)明文件manual路徑下的文件 -s :只查找source文件 -u :查找不在上述三個(gè)選項(xiàng)當(dāng)中的其他特殊文件 [root@localhost rhx]# whereis ifconfig ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz [root@localhost rhx]# su - rhx [rhx@localhost ~]$ whereis ifconfig ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz發(fā)現(xiàn)whcih命令一般普通用戶找不到的ifoncifg,使用whereis 命令可以找到,這是因?yàn)橄到y(tǒng)中存在ifconfig這個(gè)文件,但是普通用戶的PATH中并沒(méi)有加入到/sbin
3、locate
[root @localhost ~]#locate [-ir] command 參數(shù)解析: -i :忽略大小寫 -r :后面可接正則表達(dá)式的顯示方式注意:whereis 和 locate 命令查找的數(shù)據(jù)是由 創(chuàng)建的數(shù)據(jù)庫(kù)/var/lib/mlocate/里面的數(shù)據(jù)所查找的
但是數(shù)據(jù)庫(kù)的更新是一天/次,因此在未更新之前,找不到新建的文件,通過(guò)手動(dòng)進(jìn)行更新
[root@localhost ~]# updatedbupdatedb 命令回去讀取/etc/updatedb.conf 這個(gè)文件的設(shè)置,然后再去硬盤里進(jìn)行查找文件名的操作,接著進(jìn)行文件整個(gè)數(shù)據(jù)庫(kù)文件的更新
4、find
find命令的工作方式如下:沿著文件層次結(jié)構(gòu)向下遍歷,匹配符合條件的文件,執(zhí)行相應(yīng)find命令的工作方式如下:沿著文件層次結(jié)構(gòu)向下遍歷,匹配符合條件的文件,執(zhí)行相應(yīng)的操作。下面來(lái)看看find命令的各種應(yīng)用場(chǎng)景和基本用法。
[root @localhost ~]#find [PATH] [option] [option] [action] [root@localhost ~]# find . print.指定當(dāng)前目錄,.. 指定父目錄。這是Unix文件系統(tǒng)中的約定用法。
-print指明打印出匹配文件的文件名(路徑)。當(dāng)使用 -print時(shí),'\n'作為用于對(duì)輸出的文件名進(jìn)行分隔。就算你忽略-print,find命令仍會(huì)打印出文件名。-print0指明使用'\0'作為匹配的文件名之間的定界符。當(dāng)文件名中包含換行符時(shí),這個(gè)方法就有用武之地了。find 非常強(qiáng)大,下面一一介紹
a、根據(jù)文件名或者正則表達(dá)式搜索
選項(xiàng)–name的參數(shù)指定了文件名所必須匹配的字符串。我們可以將通配符作為參數(shù)使用。*.txt能夠匹配所有以.txt結(jié)尾的文件名。選項(xiàng) -print在終端中打印出符合條件(例如 -name)的文件名或文件路徑,這些匹配條件通過(guò)find命令的選項(xiàng)給出。
[root@localhost Test]# find /home/ -name "*.txt" -print /home/rhx/Test/tmp.txtfind命令有一個(gè)選項(xiàng) -iname(忽略字母大小寫),該選項(xiàng)的作用和 -name類似,只不過(guò)在匹配名字時(shí)會(huì)忽略大小寫
.如果想匹配多個(gè)條件中的一個(gè),可以采用OR條件操作
[rhx@localhost Test]$ find . \( -name "*.txt" -o -name "*.sh" \) -print這里由于使用轉(zhuǎn)義,將括號(hào)進(jìn)行轉(zhuǎn)義,括號(hào)左右兩邊需要加上括號(hào),否則會(huì)出現(xiàn)如下錯(cuò)誤
\(以及\)使用轉(zhuǎn)義,將 -name "*.txt" -o -name "*.pdf"視為一個(gè)整體
選項(xiàng)-path的參數(shù)可以使用通配符來(lái)匹配文件路徑。-name總是用給定的文件名進(jìn)行匹配。-path則將文件路徑作為一個(gè)整體進(jìn)行匹配。
正則表達(dá)式是通配符匹配的高級(jí)形式,它可以指定文本模式。我們借助這種模式來(lái)匹配文本及進(jìn)行打印。使用正則表達(dá)式進(jìn)行文本匹配的一個(gè)典型例子就是從一堆文本中解析出所有的E-mail地址。E-mail地址通常采用name@host.root這種形式,所以可以將其一般化為[a-z0-9]+@[a-z0-9]+.[a-z0-9]+。符號(hào)+ 指明在它之前的字符類中的字符可以出現(xiàn)一次或多次。
b、根據(jù)文件名或者正則表達(dá)式搜索
[rhx@localhost Test]$ find . ! -name "*.txt" -print . ./SleepingProgram.sh ./1.3.2.sh ./save ./save/SleepingProgram.sh ./save/DEBUG.sh ./save/ProgramRunningTime.sh ./ProgramRunningTime.sh ./sh1.3.sh ./1.11.1.sh ./arr.sh ./CharacterSeparator.sh ./Func.shc、根據(jù)目錄深度進(jìn)行搜索
? ? ? ?find命令在使用時(shí)會(huì)遍歷所有的子目錄。可以采用深度選項(xiàng)-maxdepth和 -mindepth來(lái)限制find命令遍歷的目錄深度。大多數(shù)情況下,只需要在當(dāng)前目錄中進(jìn)行搜索,無(wú)須再繼續(xù)向下查找。對(duì)于這種情況,使用深度選項(xiàng)來(lái)限制find命令向下查找的深度。如果只允許find在當(dāng)前目錄中查找,深度可以設(shè)置為1;當(dāng)需要向下兩級(jí)時(shí),深度可以設(shè)置為2;其他情況可以依次類推。可以用-maxzdepth指定最大深度。與此相似,也可以指定一個(gè)最小的深度,告訴find應(yīng)該從此處開始向下查找。如果想從第二級(jí)目錄開始搜索,那么就使用 -mindepth設(shè)置最小深度。使用下列命令將find命令向下的最大深度限制為1:
[rhx@localhost Test]$ find . -maxdepth 1 -name "s*" -print該命令列出當(dāng)前目錄下的所有文件名以s打頭的文件。即使有子目錄,也不會(huì)被打印或遍歷。與之類似,-maxdepth 2最多向下遍歷兩級(jí)子目錄。-mindepth類似于 -maxdepth,不過(guò)它設(shè)置的是find開始遍歷的最小深度。這個(gè)選項(xiàng)可以用來(lái)查找并打印那些距離起始路徑一定深度的所有文件。例如,打印出深度距離當(dāng)前目錄至少兩個(gè)子目錄的所有文件:
[rhx@localhost Test]$ find . -mindepth 2 -name "s*" -printd、根據(jù)文件類型進(jìn)行搜索
Unix類系統(tǒng)將一切都視為文件。文件具有不同的類型,例如普通文件、目錄、字符設(shè)備、塊設(shè)備、符號(hào)鏈接、硬鏈接、套接字以及FIFO等。
-type可以對(duì)文件搜索進(jìn)行過(guò)濾。借助這個(gè)選項(xiàng),我們可以為find命令指明特定的文件匹配類型。
e、根據(jù)文件時(shí)間進(jìn)行搜索
Linux系統(tǒng)下,每一個(gè)文件都有三個(gè)時(shí)間戳,分別是atime,ctime,mtime
atime:訪問(wèn)時(shí)間,用戶最近一次訪問(wèn)該文件的時(shí)間
ctime:文件屬性(權(quán)限,所有者)最后一次變換的時(shí)間
mtime:修改時(shí)間,文件內(nèi)容最后一次被修改的時(shí)間
三個(gè)時(shí)間中以mtime使用較多,這就mtime進(jìn)行講解,其他的相同
-mtime n:n為數(shù)字表示n天前的那一天被修改的文件,注意 0 表示24小時(shí)之內(nèi)修改內(nèi)容的文件
-mtime +n:? 列出在n天之前(不包含n本身)被更改的文件名
-mtime -n:? 列出n天之內(nèi)(不包含n本身)被更改多的文件名
-newer file:file 是一個(gè)已經(jīng)存在的文件,列出比 file 文件還要新的文件名
[rhx@localhost Test]$ find . -mtime 0 . ./SleepingProgram.sh ./1.3.2.sh ./test.txt ./exam.txt ./save ./save/SleepingProgram.sh ./save/DEBUG.sh ./save/ProgramRunningTime.sh ./ProgramRunningTime.sh ./sh1.3.sh ./1.11.1.sh ./arr.sh ./CharacterSeparator.sh ./Func.sh ./tmp.txtf、根據(jù)文件大小進(jìn)行搜索
根據(jù)文件大小進(jìn)行文件篩選
[rhx@localhost Test]$ find . -type f -size +2k #大于2k [rhx@localhost Test]$ find . -type f -size -2k #小于2k [rhx@localhost Test]$ find . -type f -size 2k #等于2kg、根據(jù)文件權(quán)限和所有者進(jìn)行搜索
-uid n : n為數(shù)字,這個(gè)數(shù)字是用戶的賬號(hào)ID,即是UID,這個(gè)UID記錄在/etc/passwd中與賬號(hào)名稱對(duì)應(yīng)的數(shù)字 -gid n: n為數(shù)字,這個(gè)數(shù)字是用戶組名的ID,即是GID,這個(gè)GID記錄在/etc/group -user name :name 為用戶名,如 root用戶,普通用戶 rhx -nouser :尋找文件的所有者不存在 /etc/passwd 中 -nogroup :尋找文件的用戶組不在/etc/group在的文件 [rhx@localhost Test]$find /home -user rhx #找出用戶在系統(tǒng)中的所有文件,很常用[rhx@localhost Test]$find /home -nouser #找出不屬于任何人的文件 -perm mode:查找文件權(quán)限等于mode的文件 [rhx@localhost Test]$find . -type f -name "s*" ! -perm 777 -printh、執(zhí)行的其他操作
-exec command:其中command為其他的命令,-exec 后面可以再接其他命令來(lái)處理查找的結(jié)果 -print :將結(jié)果打印到屏幕上這個(gè)操作時(shí)默認(rèn)的操作,因此不寫也會(huì)打印在屏幕上注意:-exec 參數(shù)后面跟的是command命令,它的終止是以;為結(jié)束標(biāo)志的,所以這句命令后面的分號(hào)?是不可缺 少?的,考慮到各個(gè)系統(tǒng)中分號(hào)會(huì)有不同的意義,所以前面加反斜杠進(jìn)行轉(zhuǎn)義 即? \;{}?用于與-exec選項(xiàng)結(jié)合使用來(lái)匹配所有文件,然后會(huì)被替換為相應(yīng)的文件名.
[rhx@localhost ~]$ find . -type f -size -2k -exec ls -l {} \;該語(yǔ)法較為特殊,這里一一解析:
{} 表示由 find 查找的內(nèi)容,其結(jié)果會(huì)放置在 {} 中
-exec ls -l? {} \;是關(guān)鍵字,表示 find? 其他命令的開始(-exec)一直到結(jié)束( \; ),這中間就是其他
例如將查找到的*.sh文件存放到一個(gè)新文件 all_sh_files.txt??中
[rhx@localhost Test]$ find . -type f -name "*.sh" -exec cat {} \;>all_sh_files.txt總結(jié)
以上是生活随笔為你收集整理的Linux之文件查找命令的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Linux之xargs
- 下一篇: Linux之tcpdump