Linux下的搜索查找命令的詳解(find)


4.find

  Linux下find命令在目錄結構中搜索文件,並執行指定的操作。Linux下find命令提供了相當多的查找條件,功能很強大。由於find具有強大的功能,所以它的選項也很多,其中大部分選項都值得我們花時間來了解一下。即使系統中含有網絡文件系統( NFS),find命令在該文件系統中同樣有效,只你具有相應的權限。 在運行一個非常消耗資源的find命令時,很多人都傾向於把它放在后台執行,因為遍歷一個大的文件系統可能會花費很長的時間

4.1.命令格式:

find pathname -options [-print -exec -ok ...]

4.2.命令功能:

用於在文件樹種查找文件,並作出相應的處理

4.3.命令參數:

pathname: find命令所查找的目錄路徑。例如用.來表示當前目錄,用/來表示系統根目錄。 
-print: find命令將匹配的文件輸出到標准輸出。 
-exec: find命令對匹配的文件執行該參數所給出的shell命令。相應命令的形式為'command' {  } \;,注意{   }和\;之間的空格。 
-ok: 和-exec的作用相同,只不過以一種更為安全的模式來執行該參數所給出的shell命令,在執行每一個命令之前,都會給出提示,讓用戶來確定是否執行。

[finance@master2-dev ~]$ cat 123.txt 
qwda
[finance@master2-dev ~]$ find 123* -ok cat {} \;
< cat ... 123.txt > ? yes
qwda
[finance@master2-dev ~]$ find 123* -exec cat {} \;
qwda
[finance@master2-dev ~]$ find 123*| xargs cat
qwda

4.4.命令選項:

-name   filename             #查找名為filename的文件
-perm                        #按執行權限來查找
-user    username             #按文件屬主來查找
-group groupname            #按組來查找
-mtime   -n +n                #按文件更改時間來查找文件,-n指n天以內,+n指n天以前
-atime    -n +n               #按文件訪問時間來查GIN: 0px">
-ctime    -n +n              #按文件創建時間來查找文件,-n指n天以內,+n指n天以前
-nogroup                     #查無有效屬組的文件,即文件的屬組在/etc/groups中不存在
-nouser                     #查無有效屬主的文件,即文件的屬主在/etc/passwd中不存
-newer   f1 !f2              找文件,-n指n天以內,+n指n天以前 
-ctime    -n +n               #按文件創建時間來查找文件,-n指n天以內,+n指n天以前 
-nogroup                     #查無有效屬組的文件,即文件的屬組在/etc/groups中不存在
-nouser                      #查無有效屬主的文件,即文件的屬主在/etc/passwd中不存
-newer   f1 !f2               #查更改時間比f1新但比f2舊的文件
-type    b/d/c/p/l/f         #查是塊設備、目錄、字符設備、管道、符號鏈接、普通文件
-size      n[c]               #查長度為n塊[或n字節]的文件
-depth                       #使查找在進入子目錄前先行查找完本目錄
-fstype                     #查更改時間比f1新但比f2舊的文件
-type    b/d/c/p/l/f         #查是塊設備、目錄、字符設備、管道、符號鏈接、普通文件
-size      n[c]               #查長度為n塊[或n字節]的文件
-depth                       #使查找在進入子目錄前先行查找完本目錄
-fstype                      #查位於某一類型文件系統中的文件,這些文件系統類型通常可 在/etc/fstab中找到
-mount                       #查文件時不跨越文件系統mount點
-follow                      #如果遇到符號鏈接文件,就跟蹤鏈接所指的文件
-cpio                %;      #查位於某一類型文件系統中的文件,這些文件系統類型通常可 在/etc/fstab中找到
-mount                       #查文件時不跨越文件系統mount點
-follow                      #如果遇到符號鏈接文件,就跟蹤鏈接所指的文件
-cpio                        #對匹配的文件使用cpio命令,將他們備份到磁帶設備中
-prune                       #忽略某個目錄

-size n:[c] 查找文件長度為n塊的文件,帶有c時表示文件長度以字節計。-depth:在查找文件時,首先查找當前目錄中的文件,然后再在其子目錄中查找。
-fstype:查找位於某一類型文件系統中的文件,這些文件系統類型通常可以在配置文件/etc/fstab中找到,該配置文件中包含了本系統中有關文件系統的信息。
-mount:在查找文件時不跨越文件系統mount點。
-follow:如果find命令遇到符號鏈接文件,就跟蹤至鏈接所指向的文件。
-cpio:對匹配的文件使用cpio命令,將這些文件備份到磁帶設備中。

另外,下面三個的區別:

-amin n   查找系統中最后N分鍾訪問的文件
-atime n  查找系統中最后n*24小時訪問的文件
-cmin n   查找系統中最后N分鍾被改變文件狀態的文件
-ctime n  查找系統中最后n*24小時被改變文件狀態的文件
-mmin n   查找系統中最后N分鍾被改變文件數據的文件
-mtime n  查找系統中最后n*24小時被改變文件數據的文件

4.5.實例

4.5.1.使用name選項:

文件名選項是find命令最常用的選項,要么單獨使用該選項,要么和其他選項一起使用。  可以使用某種文件名模式來匹配文件,記住要用引號將文件名模式引起來。  不管當前路徑是什么,如果想要在自己的根目錄$HOME中查找文件名符合*.log的文件,使用~作為 'pathname'參數,波浪號~代表了你的$HOME目錄。

find ~ -name "*.log" -print  ------*表示  通配任意的字符      ?表示  通配任意的單個字符

想要在當前目錄及子目錄中查找所有的‘ *.log‘文件,可以用: 

find . -name "*.log" -print  

想要的當前目錄及子目錄中查找文件名以一個大寫字母開頭的文件,可以用:  

find . -name "[A-Z]*" -print  ---------[ ] 表示 通配括號里面的任意一個字符

想要在/etc目錄中查找文件名以host開頭的文件,可以用:  

find /etc -name "host*" -print  

如果想在當前目錄查找文件名以一個個小寫字母開頭,最后是4到9加上.log結束的文件:  

[finance@master2-dev ~]$ find . -name "[a-z]*[4-9].log" -print
./script/hs_err_pid32186.log
./script/hs_err_pid19725.log
./script/hs_err_pid5736.log

4.5.2.用perm選項:

按照文件權限模式用-perm選項,按文件權限模式來查找文件的話。最好使用八進制的權限表示法。  

如在當前目錄下查找文件權限位為755的文件,即文件屬主可以讀、寫、執行,其他用戶可以讀、執行的文件,可以用:  

[finance@master2-dev ~]$ find . -perm 755 -print

還有一種表達方法:在八進制數字前面要加一個橫杠-,表示都匹配,如-007就相當於777,-005相當於555,

4.5.3.忽略某個目錄:

如果在查找文件時希望忽略某個目錄,因為你知道那個目錄中沒有你所要查找的文件,那么可以使用-prune選項來指出需要忽略的目錄。在使用-prune選項時要當心,因為如果你同時使用了-depth選項,那么-prune選項就會被find命令忽略。如果希望在test目錄下查找文件,但不希望在test/test3目錄下查找,可以用:  

命令:

find test -path "test/test3" -prune -o -print

[finance@master2-dev ~]$ find . -name *log
./nby/dm_rpt_070001_rds_d.log
./nby/rpt_sms_001_d_group.log
./nby/rpt_170006_ams_d.log
./nby/mls_epp_member_lab_info.log
./nby/rpt_170009_ams_d.log
./nby/bi_td.tsor_page_prmtr_enter_td.log
./nby/tmp_act_acct_info.log
./nby/rpt_170010_ams_d.log
./nby/bi_td.tsor_br_page_cate_td.log
./nby/dpa_pty_onl_rgst_info.log
./nby/finance.sor_mls_fnd_bill_order.log
./.sqoop/shared-metastore.db.log
./script/hs_err_pid30353.log
./script/hs_err_pid32186.log
./script/hs_err_pid19725.log
./script/log
./script/log/hiveserver2.log
./script/log/restartHiveServer2.log
./script/hs_err_pid5736.log
./syf/dm_rpt_090005_pcs_m.log
./syf/dm_rpt_090006_pcs_m.log
./syf/dm_rpt_090004_pcs_m.log
[finance@master2-dev ~]$ find . -path "./syf" -prune -o -name *log -print
./nby/dm_rpt_070001_rds_d.log
./nby/rpt_sms_001_d_group.log
./nby/rpt_170006_ams_d.log
./nby/mls_epp_member_lab_info.log
./nby/rpt_170009_ams_d.log
./nby/bi_td.tsor_page_prmtr_enter_td.log
./nby/tmp_act_acct_info.log
./nby/rpt_170010_ams_d.log
./nby/bi_td.tsor_br_page_cate_td.log
./nby/dpa_pty_onl_rgst_info.log
./nby/finance.sor_mls_fnd_bill_order.log
./.sqoop/shared-metastore.db.log
./script/hs_err_pid30353.log
./script/hs_err_pid32186.log
./script/hs_err_pid19725.log
./script/log
./script/log/hiveserver2.log
./script/log/restartHiveServer2.log
./script/hs_err_pid5736.log

實例2:避開多個文件夾:

[finance@master2-dev ~]$ find .  \(  -path "./syf" -o -path "./script" \)  -prune -o -name *log -print
./nby/dm_rpt_070001_rds_d.log
./nby/rpt_sms_001_d_group.log
./nby/rpt_170006_ams_d.log
./nby/mls_epp_member_lab_info.log
./nby/rpt_170009_ams_d.log
./nby/bi_td.tsor_page_prmtr_enter_td.log
./nby/tmp_act_acct_info.log
./nby/rpt_170010_ams_d.log
./nby/bi_td.tsor_br_page_cate_td.log
./nby/dpa_pty_onl_rgst_info.log
./nby/finance.sor_mls_fnd_bill_order.log
./.sqoop/shared-metastore.db.log

說明:

圓括號表示表達式的結合。  \ 表示引用,即指示 shell 不對后面的字符作特殊解釋,而留給 find 命令去解釋其意義。  

4.5.4.使用user和nouser選項:

按文件屬主查找文件:

實例1:在$HOME目錄中查找文件屬主為finance的文件 

命令:

find ~ -user finance -print

實例2:在/etc目錄下查找文件屬主為peida的文件: 

命令:

find /etc/ -user finance -print

說明:

實例3:為了查找屬主帳戶已經被刪除的文件,可以使用-nouser選項。在/home目錄下查找所有的這類文件

命令:

find /home -nouser -print

說明:

這樣就能夠找到那些屬主在/etc/passwd文件中沒有有效帳戶的文件。在使用-nouser選項時,不必給出用戶名; find命令能夠為你完成相應的工作。

4.5.5.使用group和nogroup選項:

就像user和nouser選項一樣,針對文件所屬於的用戶組, find命令也具有同樣的選項,為了在/home/finance目錄下查找屬於gem用戶組的文件,可以用:  

find /home/finance/ -group finance -print  

要查找沒有有效所屬用戶組的所有文件,可以使用nogroup選項。下面的find命令從文件系統的根目錄處查找這樣的文件:

find / -nogroup-print

4.5.6.按照更改時間或訪問時間等查找文件:

如果希望按照更改時間來查找文件,可以使用mtime,atime或ctime選項。如果系統突然沒有可用空間了,很有可能某一個文件的長度在此期間增長迅速,這時就可以用mtime選項來查找這樣的文件。  

用減號-來限定更改時間在距今n日以內的文件,而用加號+來限定更改時間在距今n日以前的文件。  

希望在系統/home/finance/下查找更改時間在5日以內的文件,可以用:

[finance@master2-dev ~]$ find /home/finance/ -mtime -5 -print
/home/finance/
/home/finance/123.txt
/home/finance/.bash_history
/home/finance/data.txt
/home/finance/.viminfo
/home/finance/.subversion
/home/finance/.subversion/README.txt
/home/finance/.subversion/servers
/home/finance/.subversion/auth
/home/finance/.subversion/auth/svn.simple
/home/finance/.subversion/auth/svn.username
/home/finance/.subversion/auth/svn.ssl.server
/home/finance/.subversion/auth/svn.ssl.client-passphrase
/home/finance/.subversion/config
/home/finance/script
/home/finance/script/monitor_hiveserver2_leak.sh
/home/finance/script/log/hiveserver2.log

4.5.7.查找比某個文件新或舊的文件:

如果希望查找更改時間比某個文件新但比另一個文件舊的所有文件,可以使用-newer選項。

它的一般形式為:  

newest_file_name ! oldest_file_name  

其中,!是邏輯非符號。  

[finance@master2-dev nby]$ ll
total 500
-rw-r--r-- 1 finance finance 123029 Dec 18  2015 170006.csv
-rw-r--r-- 1 finance finance   4144 Dec 18  2015 170007.csv
-rw-r--r-- 1 finance finance  21075 Dec 18  2015 170009.csv
-rw-r--r-- 1 finance finance 135309 Dec 18  2015 170010.csv
-rw-rw-r-- 1 finance finance   6811 Jun 16  2015 bi_td.tsor_br_page_cate_td.log
-rw-rw-r-- 1 finance finance   6842 Jun 16  2015 bi_td.tsor_page_prmtr_enter_td.log
-rw-r--r-- 1 finance finance    129 Apr 21  2015 bsn.txt
-rw-rw-r-- 1 finance finance  22942 Apr 22  2015 dm_rpt_070001_rds_d.log
-rw-rw-r-- 1 finance finance  25510 Aug 18  2015 dpa_pty_onl_rgst_info.log
-rw-rw-r-- 1 finance finance    167 Apr 21  2015 finance.csv
-rw-rw-r-- 1 finance finance    751 Apr  1  2015 finance.sor_mls_fnd_bill_order.log
-rw-rw-r-- 1 finance finance    126 Apr 21  2015 finance.txt
-rw-rw-r-- 1 finance finance   5326 Jun 10  2015 mls_epp_member_lab_info.log
-rw-r--r-- 1 finance finance     30 Apr 21  2015 nat.txt
-rw-rw-r-- 1 finance finance  24983 Dec 18  2015 rpt_170006_ams_d.log
-rw-rw-r-- 1 finance finance  24424 Dec 18  2015 rpt_170009_ams_d.log
-rw-rw-r-- 1 finance finance  24495 Dec 18  2015 rpt_170010_ams_d.log
-rw-rw-r-- 1 finance finance    513 Jun 10  2015 rpt_sms_001_d_group.log
-rw-r--r-- 1 finance finance     83 Apr 21  2015 rule.txt
-rw-rw-r-- 1 finance finance  24856 Aug 18  2015 tmp_act_acct_info.log
[finance@master2-dev nby]$ find -newer bi_td.tsor_br_page_cate_td.log
.
./170006.csv
./rpt_170006_ams_d.log
./170009.csv
./170010.csv
./rpt_170009_ams_d.log
./170007.csv
./bi_td.tsor_page_prmtr_enter_td.log
./tmp_act_acct_info.log
./rpt_170010_ams_d.log
./dpa_pty_onl_rgst_info.log
[finance@master2-dev nby]$ find ! -newer bi_td.tsor_br_page_cate_td.log
./dm_rpt_070001_rds_d.log
./rpt_sms_001_d_group.log
./finance.csv
./mls_epp_member_lab_info.log
./bsn.txt
./finance.txt
./nat.txt
./bi_td.tsor_br_page_cate_td.log
./rule.txt
./finance.sor_mls_fnd_bill_order.log
[finance@master2-dev nby]$ find -newer bi_td.tsor_br_page_cate_td.log ! -newer bi_td.tsor_page_prmtr_enter_td.log
./bi_td.tsor_page_prmtr_enter_td.log
[finance@master2-dev nby]$ find -newer bi_td.tsor_br_page_cate_td.log ! -newer 170006.csv 
./170006.csv
./170009.csv
./170010.csv
./bi_td.tsor_page_prmtr_enter_td.log
./tmp_act_acct_info.log
./dpa_pty_onl_rgst_info.log

4.5.8.使用type選項:

實例1:在/etc目錄下查找所有的目錄  

命令:

[finance@master2-dev ~]$ find  -type d
.
./20160427
./export_temp_dpa_rist_cust_init.txt
./fanghh
./fanghh/lx
./fanghh/script
./nby
./jars
./.gnome2
./.gnome2/keyrings
./.sqoop
./.subversion
./.subversion/auth
./.subversion/auth/svn.simple
./.subversion/auth/svn.username
./.subversion/auth/svn.ssl.server
./.subversion/auth/svn.ssl.client-passphrase
./script
./script/log
./.ssh
./syf
./tmp
./mls

實例2:在當前目錄下查找除目錄以外的所有類型的文件  

命令:

[finance@master2-dev ~]$ find . ! -type d -print 
./.history
./123.txt
./.bashrc
./export_temp_dpa_rist_cust_init.txt/.000000_0.deflate.crc
./export_temp_dpa_rist_cust_init.txt/000001_0.deflate
./export_temp_dpa_rist_cust_init.txt/.000001_0.deflate.crc
./export_temp_dpa_rist_cust_init.txt/000000_0.deflate
./%s
./fanghh/test.py
./fanghh/rules.py
./fanghh/lx/dm_app_finance_service_daily_data_20160804.csv
./fanghh/script/dm_rpt_130019_fsa_web_02_d.sql
./fanghh/script/dpa_fsa_br_base_pageview.sql
./fanghh/script/dm_rpt_130016_fsa_web_01_d.sql
./fanghh/script/dm_rpt_130014_fsa_web_d.sql
......

實例3:在當前目錄下查找所有的符號鏈接文件

命令:

[finance@master2-dev ~]$ find -type l -print
./workspace

4.5.9.使用size選項:

可以按照文件長度來查找文件,這里所指的文件長度既可以用塊(block)來計量,也可以用字節來計量。以字節計量文件長度的表達形式為N c;以塊計量文件長度只用數字表示即可。  

在按照文件長度查找文件時,一般使用這種以字節表示的文件長度,在查看文件系統的大小,因為這時使用塊來計量更容易轉換。  

實例1:在當前目錄下查找文件長度大於1 M字節的文件  

命令:

[finance@master2-dev ~]$ find . -size +1000000c -print
./fanghh/script/dpa_cde_fsa_br_utm_src.init
./fanghh/hadoop-0.0.1-jar-with-dependencies.jar
./jars/spark-assembly-1.4.0-hadoop2.4.0.jar
./script/log/hiveserver2.log
./tmp/export_dpa_crd_cshop_main_info.txt

實例2:在/home/apache目錄下查找文件長度恰好為100字節的文件:  

命令:

find /home/apache -size 100c -print  

實例3:在當前目錄下查找長度超過10塊的文件(一塊等於512字節) 

命令:

find . -size +10 -print

4.5.10.使用depth選項:

在使用find命令時,可能希望先匹配所有的文件,再在子目錄中查找。使用depth選項就可以使find命令這樣做。這樣做的一個原因就是,當在使用find命令向磁帶上備份文件系統時,希望首先備份所有的文件,其次再備份子目錄中的文件。  

實例1:find命令從文件系統的根目錄開始,查找一個名為CON.FILE的文件。   

命令:

find / -name "CON.FILE" -depth -print

說明:

它將首先匹配所有的文件然后再進入子目錄中查找

4.5.11.使用mount選項: 

  在當前的文件系統中查找文件(不進入其他文件系統),可以使用find命令的mount選項。

實例1:從當前目錄開始查找位於本文件系統中文件名以XC結尾的文件  

命令:

find . -name "*.XC" -mount -print 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM