天天看點

檔案查找之find用法

一、linux可以用于查找的相關指令(本次重點在于說明find用法)

1、find:

是最為強大的查找指令,可以查找到你所想要找的所有檔案

2、locate

同樣也是一個檔案查找指令,locate指令其實是"find-name"的另一種寫法,但是要比後者快得多,原因在于它不搜尋具體目錄,而是搜尋一個資料庫,這個資料庫中含有本地所有檔案資訊。Linux系統自動建立這個資料庫,并且每天自動更新一次,是以使用locate指令查不到最新變動過的檔案。

3、whereis

whereis指令隻能用于程式名稱的搜尋,而且隻搜尋二進制檔案(參數-b)、man說明檔案(參數-m)和源代碼檔案(參數-s)。如果省略參數,則傳回所有資訊。

1

2

<code>[root@localhost ~]</code><code># whereis yum</code>

<code>yum: </code><code>/usr/bin/yum</code> <code>/etc/yum</code> <code>/etc/yum</code><code>.conf </code><code>/usr/share/man/man8/yum</code><code>.8.gz</code>

4、which

which指令的作用是,在PATH環境變量指定的路徑中,搜尋某個系統指令的位置,并且傳回第一個搜尋結果。也就是說,使用which指令,就可以檢視某個系統指令是否存在,以及執行的到底是哪一個位置的可執行檔案(即指令)

<code>[root@localhost ~]</code><code># which yum</code>

<code>/usr/bin/yum</code>

5、type

type指令其實不能算查找指令,它是用來查找某個指令到底是由shell自帶的,還是由shell外部的獨立二進制檔案提供的。

<code>[root@localhost ~]</code><code># type yum</code>

<code>yum is </code><code>/usr/bin/yum</code>

從以上各指令的功能可以看出,雖然在linux中有諸多可以用于查找的指令,但能夠基于檔案(指令也是一個可執行檔案之一)層次查找的隻有find與locate,兩者差別也比較明顯。

find與loacte的差別

find:

優點:可實時查找,精确比對

缺點:範圍周遊,速度慢

locate:

優點:查找速度快

缺點:依賴于資料庫、非實時查找

二、find 用法

格式:

find [options] [查找路徑] [查找條件] [處理動作]

   查找路徑:預設為目前目錄

   查找條件:預設為查找指定路徑下的所有檔案

   處理動作:預設為顯示

1、條件查找(支援檔案名通配)

-name "File_name"

按名稱查找

3

4

5

6

7

8

<code>#查找/var/lib目錄下,名字為rpm的目錄或檔案</code>

<code>[root@localhost lib]</code><code># pwd</code>

<code>/var/lib</code>

<code>[root@localhost lib]</code><code># find -name "rpm"</code>

<code>.</code><code>/rpm</code>

<code>[root@localhost lib]</code><code># ls -ld rpm/</code>

<code>drwxr-xr-x. 2 root root 4096 Feb 26 08:06 rpm/</code>

<code>[root@localhost lib]</code><code>#</code>

-name "*"

查找任意長度的任意字元

<code>#查找/var/lib目錄下以任意長度任意字元開頭以數字結尾的檔案或目錄</code>

<code>[root@localhost lib]</code><code># find -name "*5"</code>

<code>.</code><code>/yum/history/2014-02-23/5</code>

<code>.</code><code>/rpm/Sigmd5</code>

<code>[root@localhost lib]</code><code># ls -l rpm/Sigmd5</code>

<code>-rw-r--r--. 1 root root 77824 Feb 24 22:08 rpm</code><code>/Sigmd5</code>

<code>[root@localhost lib]</code><code># ls -ld yum/history/2014-02-23/5/</code>

<code>drwx------ 2 root root 4096 Feb 23 19:47 yum</code><code>/history/2014-02-23/5/</code>

-name "?"

包含任意單個定符

<code>#查找/var/log下名字以s開頭後面跟一個任意字元結尾的檔案或目錄</code>

<code>[root@localhost log]</code><code># find -name "s?"</code>

<code>.</code><code>/sa</code>

<code>[root@localhost log]</code><code># ls -ld sa</code>

<code>drwxr-xr-x. 2 root root 4096 Feb 26 00:00 sa</code>

-name "[]"

範圍内的任意字元

<code>#查找/var/log/sa下名字以sa開頭後跟兩個數字的目錄或檔案</code>

<code>[root@localhost sa]</code><code># pwd</code>

<code>/var/log/sa</code>

<code>[root@localhost sa]</code><code># find -name "sa[0-9][0-9]"</code>

<code>.</code><code>/sa23</code>

<code>.</code><code>/sa25</code>

<code>.</code><code>/sa26</code>

<code>.</code><code>/sa24</code>

-name "[^]"

範圍外的任意字元

9

10

11

12

13

14

15

<code>#查找目前目錄下名字不是小寫字母開頭的檔案或目錄</code>

<code>[root@localhost rpm]</code><code># pwd</code>

<code>/var/lib/rpm</code>

<code>[root@localhost rpm]</code><code># find -name "[^[:lower:]]*"</code>

<code>.</code>

<code>.</code><code>/Filedigests</code>

<code>.</code><code>/Sha1header</code>

<code>.</code><code>/Provideversion</code>

<code>.</code><code>/Dirnames</code>

<code>.</code><code>/Packages</code>

<code>.</code><code>/Obsoletename</code>

<code>.</code><code>/Providename</code>

<code>.</code><code>/Conflictname</code>

<code>.</code><code>/Requirename</code>

<code>......</code>

-iname "File_name"

查找時不區分字元大小寫

16

17

<code>[root@localhost log]</code><code># pwd</code>

<code>/var/log</code>

<code>[root@localhost log]</code><code># find -iname "[a-z]*"</code>

<code>...</code>

<code>.</code><code>/anaconda</code><code>.syslog</code>

<code>.</code><code>/prelink</code>

<code>.</code><code>/prelink/prelink</code><code>.log</code>

<code>.</code><code>/dmesg</code><code>.old</code>

<code>.</code><code>/lastlog</code>

<code>.</code><code>/anaconda</code><code>.ifcfg.log</code>

<code>.</code><code>/cron</code>

<code>.</code><code>/dracut</code><code>.log</code>

<code>.</code><code>/messages</code>

<code>.</code><code>/ConsoleKit</code>

<code>.</code><code>/ConsoleKit/history</code>

<code>.</code><code>/cups</code>

<code>....</code>

-user UserName

根據屬主查找

<code>[root@localhost tmp]</code><code># pwd;ls -l</code>

<code>/tmp</code>

<code>total 92</code>

<code>-rwxr-xr-x  1 root      root      48568 Feb 25 12:31 </code><code>cat</code>

<code>-rw-rw-r--  1 docker    docker        0 Feb 26 12:08 Device.c</code>

<code>-rw-rw-r--  1 docker    docker        0 Feb 26 12:08 device.h</code>

<code>-rw-rw-r--  1 docker    docker        0 Feb 26 12:08 device.txt</code>

<code>-rwx------. 1 root      root       1195 Feb 23 19:26 ks-script-rxXCJd</code>

<code>-rwxr-xr-x. 1 root      root        346 Feb 23 19:26 ks-script-rxXCJd.log</code>

<code>-rw-r--r--  1 openstack openstack   720 Feb 26 09:23 mounts.txt</code>

<code>[root@localhost tmp]</code><code># find -user docker</code>

<code>.</code><code>/device</code><code>.h</code>

<code>.</code><code>/Device</code><code>.c</code>

<code>.</code><code>/device</code><code>.txt</code>

-group GroupName

根據屬組查找

<code>[root@localhost tmp]</code><code># ll</code>

<code>drwxr-xr-x  2 root      root       4096 Feb 25 18:39 repo</code>

<code>-rw-r--r--  1 root      openstack   242 Feb 23 21:23 scprit.sh</code>

<code>drwxr-xr-x  2 root      root       4096 Feb 25 22:53 script</code>

<code>-rw-r--r--  1 root      root        106 Feb 24 11:46 tast.txt</code>

<code>drwxr-xr-x  2 root      root       4096 Feb 25 12:32 </code><code>test</code>

<code>-rw-r--r--  1 root      openstack   145 Feb 24 16:49 test2.sh</code>

<code>-rw-r--r--  1 root      openstack   125 Feb 24 16:56 test3.sh</code>

<code>-rw-r--r--  1 root      openstack   721 Feb 24 17:04 test4.sh</code>

<code>-rw-------. 1 root      root          0 Feb 23 19:12 yum.log</code>

<code>[root@localhost tmp]</code><code># find -group openstack</code>

<code>.</code><code>/scprit</code><code>.sh</code>

<code>.</code><code>/test4</code><code>.sh</code>

<code>.</code><code>/test2</code><code>.sh</code>

<code>.</code><code>/test3</code><code>.sh</code>

<code>.</code><code>/mounts</code><code>.txt</code>

-uid UID

按照使用者的UID查找

<code>-rw-rw-r--  1       502       502     0 Feb 26 12:08 Device.c</code>

<code>-rw-rw-r--  1       502       502     0 Feb 26 12:08 device.h</code>

<code>-rw-rw-r--  1       502       502     0 Feb 26 12:08 device.txt</code>

<code>-rwxr-xr-x. 1 root      root        346 Feb 23 19:26 ks-script-rxXCJd.l</code>

<code>[root@localhost tmp]</code><code># find -uid 502</code>

<code>#當有使用者被删除了,那麼他的檔案屬組,将變成他之前的UID或GIU,</code>

<code>#UID與GID就是在這種情況下用來定位的,以便後好的處理這些檔案。</code>

<code>#當然存在的使用者也可使用UID或GID來查找.</code>

-gid GID

按照使用者的的GID查找

<code>[root@localhost tmp]</code><code># ls -l</code>

<code>-rw-r--r--  1  501  501   720 Feb 26 09:23 mounts.txt</code>

<code>drwxr-xr-x  2 root root  4096 Feb 25 18:39 repo</code>

<code>-rw-r--r--  1 root  501   242 Feb 23 21:23 scprit.sh</code>

<code>drwxr-xr-x  2 root root  4096 Feb 25 22:53 script</code>

<code>-rw-r--r--  1 root root   106 Feb 24 11:46 tast.txt</code>

<code>drwxr-xr-x  2 root root  4096 Feb 25 12:32 </code><code>test</code>

<code>-rw-r--r--  1 root  501   145 Feb 24 16:49 test2.sh</code>

<code>-rw-r--r--  1 root  501   125 Feb 24 16:56 test3.sh</code>

<code>-rw-r--r--  1 root  501   721 Feb 24 17:04 test4.sh</code>

<code>[root@localhost tmp]</code><code># find -gid 501</code>

-nouser

查無有效屬主的檔案,即檔案的屬主在/etc/passwd中不存在

18

19

20

21

22

23

24

25

<code>[root@localhost include]</code><code># pwd</code>

<code>/root/Download/httpd-2</code><code>.2.26</code><code>/include</code>

<code>[root@localhost include]</code><code># ll</code>

<code>total 404</code>

<code>-rw-r--r-- 1  501 games  1075 Jul 12  2006 ap_compat.h</code>

<code>-rw-r--r-- 1 root root   7371 Feb 24 20:29 ap_config_auto.h</code>

<code>-rw-r--r-- 1  501 games  6850 Nov 14 00:51 ap_config_auto.h.</code><code>in</code>

<code>-rw-r--r-- 1  501 games  9472 Apr 15  2011 ap_config.h</code>

<code>-rw-r--r-- 1 root root   2704 Feb 24 21:58 ap_config_layout.h</code>

<code>-rw-r--r-- 1  501 games  2784 Jul 12  2006 ap_config_layout.h.</code><code>in</code>

<code>-rw-r--r-- 1  501 games  4167 May 10  2007 ap_listen.h</code>

<code>-rw-r--r-- 1  501 games  9803 Jun 28  2013 ap_mmn.h</code>

<code>[root@localhost include]</code><code># find . -nouser</code>

<code>.</code><code>/http_request</code><code>.h</code>

<code>.</code><code>/util_xml</code><code>.h</code>

<code>.</code><code>/util_ldap</code><code>.h</code>

<code>.</code><code>/ap_mmn</code><code>.h</code>

<code>.</code><code>/ap_release</code><code>.h</code>

<code>./.indent.pro</code>

<code>.</code><code>/ap_config</code><code>.h</code>

<code>.</code><code>/util_script</code><code>.h</code>

<code>.</code><code>/httpd</code><code>.h</code>

<code>.</code><code>/ap_listen</code><code>.h</code>

<code>.</code><code>/ap_mpm</code><code>.h</code>

-nogroup

查無有效屬組的檔案,即檔案的屬組在/etc/group中不存在

<code>[root@localhost tmp]</code><code># pwd</code>

<code>-rwxr-xr-x  1 root root 48568 Feb 25 12:31 </code><code>cat</code>

<code>-rw-rw-r--  1  502  502     0 Feb 26 12:08 Device.c</code>

<code>-rw-rw-r--  1  502  502     0 Feb 26 12:08 device.h</code>

<code>-rw-rw-r--  1  502  502     0 Feb 26 12:08 device.txt</code>

<code>-rwx------. 1 root root  1195 Feb 23 19:26 ks-script-rxXCJd</code>

<code>-rwxr-xr-x. 1 root root   346 Feb 23 19:26 ks-script-rxXCJd.log</code>

<code>[root@localhost tmp]</code><code># find -nogroup</code>

2、組合條件

-a

與,同時滿足(and)

<code>[root@localhost tmp]</code><code># find -user root -nogroup</code>

<code>[root@localhost tmp]</code><code># find -user root -a -nogroup</code>

-o

或(or)

<code>[root@localhost tmp]</code><code># find -nouser -o -nogroup</code>

-not, !

非,取反

<code>[root@localhost tmp]</code><code># find ! -user root</code>

<code>[root@localhost tmp]</code><code># find -not -user root</code>

3、檔案類型查找(type)

-type f

普通檔案

<code>#查找檔案類型為普通檔案屬主不是root使用者或沒有屬組的檔案</code>

<code>-rw-------. 1 root root     0 Feb 23 19:12 yum.log</code>

<code>[root@localhost tmp]</code><code># find -type f -not -user root -o -nogroup</code>

目錄

-type b

塊裝置

-type c

字元裝置

-type l

符号連結檔案

-type p

命名管道

-type s

套接

其它檔案類型查找方法與f用法相同。

4、檔案大小查找(-size [+|-]#),Unit(c:位元組,k:KB,M:MB,G:GB

-size #

指定大小(取值是不大于)

-size +#

大于#

<code>#查找/etc/下類型為普通檔案且大于2M</code>

<code>[root@localhost tmp]</code><code># find  /etc/  -type f -size +2M</code>

<code>/etc/selinux/targeted/modules/active/policy</code><code>.kern</code>

<code>/etc/selinux/targeted/policy/policy</code><code>.24</code>

<code>[root@localhost tmp]</code><code># ls -lh /etc/selinux/targeted/modules/active/policy.kern /etc/selinux/targeted/policy/policy.24</code>

<code>-rw-r--r--. 1 root root 7.0M Feb 23 19:19 </code><code>/etc/selinux/targeted/modules/active/policy</code><code>.kern</code>

<code>-rw-r--r--. 1 root root 7.0M Feb 23 19:19 </code><code>/etc/selinux/targeted/policy/policy</code><code>.24</code>

-size: -#

小于#

5、時間戳查找

以天為機關(time):

-atime [+|-]#

-mtime [+|-]#

修改時間

-ctime [+|-]#

改變時間

通路時間

<code>#查找在系統中2天内通路的檔案</code>

<code>[root@localhost tmp]</code><code># find -atime -2</code>

<code>.</code><code>/script</code>

<code>.</code><code>/script/b</code><code>.sh</code>

<code>.</code><code>/script/yum_install</code><code>.sh</code>

<code>.</code><code>/script/show_uid</code><code>.sh</code>

<code>./.ICE-unix</code>

<code>.</code><code>/cat</code>

<code>.</code><code>/test</code>

<code>.</code><code>/repo</code>

<code>.</code><code>/repo/CentOS-Base</code><code>.repo</code>

以分鐘為機關(min)[+|-]#:    

-amin [+|-]#

-mmin [+|-]#

<code>#查找在/tmp/script/5分鐘之内修改過的檔案</code>

<code>[root@localhost script]</code><code># find /tmp/script/ -mmin -5 |ls -l</code>

<code>total 12</code>

<code>-rw-r--r-- 1 root root 630 Feb 26 16:37 b.sh</code>

<code>-rw-r--r-- 1 root root 232 Feb 26 16:36 show_uid.sh</code>

<code>-rw-r--r-- 1 root root 795 Feb 26 16:36 yum_install.sh</code>

-cmin [+|-]#

6、權限查找

   -perm [+|-]MODE

-perm MODE

精确比對

<code>#查找類型為普通檔案,權限為755的檔案</code>

<code>[root@localhost tmp]</code><code># ls -l [ktc]*</code>

<code>[root@localhost tmp]</code><code>#  find . -type f  -perm  755</code>

<code>.</code><code>/ks-script-rxXCJd</code><code>.log</code>

-perm +MODE

任何一類使用者的任何一位權限比對;常用于查找某類使用者的某特定權限是否存在

<code>[root@localhost etc]</code><code># find /etc/sysconfig/ -type f -perm +744 |ls -l</code>

<code>total 1912</code>

<code>drwxr-xr-x.  3 root root   4096 Feb 23 19:15 abrt</code>

<code>drwxr-xr-x.  4 root root   4096 Feb 23 19:21 acpi</code>

<code>-rw-r--r--.  1 root root     46 Feb 26 12:16 adjtime</code>

<code>-rw-r--r--.  1 root root   1512 Jan 12  2010 aliases</code>

<code>-rw-r--r--   1 root root  12288 Feb 23 19:27 aliases.db</code>

<code>drwxr-xr-x.  2 root root   4096 Feb 23 19:19 alsa</code>

<code>drwxr-xr-x.  2 root root   4096 Feb 24 22:08 alternatives</code>

<code>-rw-------.  1 root root    541 Nov 23 20:43 anacrontab</code>

<code>-rw-r--r--.  1 root root    148 May 15  2009 asound.conf</code>

<code>-rw-r--r--.  1 root root      1 Jan 30  2012 at.deny</code>

<code>-rw-r--r--   1 root root      0 Feb 26 14:01 A.txt</code>

<code>.....</code>

-MODE

每類使用者的指定要檢查的權限位都比對

<code>#在/etc/查找類型為普通檔案,每一類使用者權限上都要比對</code>

<code>[root@localhost tmp]</code><code># find /etc/ppp/  -type f  -perm -154 -ls</code>

<code>393983    4 -rwxr-xr-x   1 root     root         3196 Oct 10 22:48 </code><code>/etc/ppp/ipv6-up</code>

<code>393978    4 -rwxr-xr-x   1 root     root          386 Oct 10 22:48 </code><code>/etc/ppp/ip-down</code>

<code>393982    4 -rwxr-xr-x   1 root     root         1687 Oct 10 22:48 </code><code>/etc/ppp/ipv6-down</code>

<code>393981    8 -rwxr-xr-x   1 root     root         6517 Oct 10 22:48 </code><code>/etc/ppp/ip-up</code><code>.ipv6to4</code>

<code>393980    4 -rwxr-xr-x   1 root     root          430 Oct 10 22:48 </code><code>/etc/ppp/ip-up</code>

<code>393979    4 -rwxr-xr-x   1 root     root         3262 Oct 10 22:48 </code><code>/etc/ppp/ip-down</code><code>.ipv6to4</code>

7、處理動作:

-print

列印在标準輸出上(預設);

-ls

以長格式輸出各檔案資訊

-exec COMMAND {} \;

對查找到的檔案執行指定的指令

<code>#查詢當天修改過的檔案</code>

<code>[root@localhost tmp]</code><code>#  find . -mtime -1 -type f -exec ls -l {} \;</code>

<code>-rw-rw-r-- 1 502 502 0 Feb 26 12:08 .</code><code>/device</code><code>.h</code>

<code>-rw-rw-r-- 1 502 502 0 Feb 26 12:08 .</code><code>/Device</code><code>.c</code>

<code>-rw-rw-r-- 1 502 502 0 Feb 26 12:08 .</code><code>/device</code><code>.txt</code>

<code>-rw-r--r-- 1 root root 629 Feb 25 18:32 .</code><code>/script/b</code><code>.sh</code>

<code>-rw-r--r-- 1 root root 794 Feb 25 22:53 .</code><code>/script/yum_install</code><code>.sh</code>

<code>-rw-r--r-- 1 root root 231 Feb 25 17:32 .</code><code>/script/show_uid</code><code>.sh</code>

<code>-rw-r--r-- 1 501 501 720 Feb 26 09:23 .</code><code>/mounts</code><code>.txt</code>

<code>-rw-r--r-- 1 root root 1926 Feb 25 18:37 .</code><code>/repo/CentOS-Base</code><code>.repo</code>

-ok COMMAND {} \;

互動式的-exec

<code>#查找類型為普通檔案,修改時間不大于兩天的檔案是否顯示</code>

<code>[root@localhost tmp]</code><code># find ./ -mtime -1 -type f -ok ls -l {} \;</code>

<code>&lt; </code><code>ls</code> <code>... .</code><code>/device</code><code>.h &gt; ? Y</code>

<code>&lt; </code><code>ls</code> <code>... .</code><code>/Device</code><code>.c &gt; ? Y</code>

<code>&lt; </code><code>ls</code> <code>... .</code><code>/device</code><code>.txt &gt; ? Y</code>

<code>&lt; </code><code>ls</code> <code>... .</code><code>/script/b</code><code>.sh &gt; ? Y</code>

<code>&lt; </code><code>ls</code> <code>... .</code><code>/script/yum_install</code><code>.sh &gt; ? Y</code>

<code>&lt; </code><code>ls</code> <code>... .</code><code>/script/show_uid</code><code>.sh &gt; ? Y</code>

find把查找到的所有檔案一次性地傳遞給-exec所指定的指令

<code>[root@localhost tmp]</code><code># ls -l *.doc</code>

<code>-rw-r--r-- 1 root root 0 Feb 26 16:53 fdsfd.doc</code>

<code>-rw-r--r-- 1 root root 0 Feb 26 16:52 WER.doc</code>

<code>[root@localhost tmp]</code><code># find /tmp -iname "*.doc " | rm -rf</code>

<code>[root@localhost tmp]</code><code># find /tmp -iname "*.doc" -exec mv {} {}x \;</code>

<code>[root@localhost tmp]</code><code># ls -l *.docx</code>

<code>-rw-r--r-- 1 root root 0 Feb 26 16:47 asdfadf.docx</code>

<code>-rw-r--r-- 1 root root 0 Feb 26 16:53 fdsfd.docx</code>

<code>-rw-r--r-- 1 root root 0 Feb 26 16:52 WER.docx</code>

<code>-rw-r--r-- 1 root root 0 Feb 26 16:47 xxx.docx</code>

注:find:把查找到的所有檔案一次性地傳遞給-exec所指定的檔案

管道傳遞的是字元串,不能使用檔案操作指令處理,

如果要用可以使用以下指令

<code>[root@localhost tmp]</code><code># touch asdf.c</code>

<code>[root@localhost tmp]</code><code># touch asdf.h</code>

<code>[root@localhost tmp]</code><code># touch asdf.so</code>

<code>[root@localhost tmp]</code><code># touch asdf.ppt</code>

<code>[root@localhost tmp]</code><code># touch asdf.doc</code>

<code>[root@localhost tmp]</code><code># touch study.dox</code>

<code>[root@localhost tmp]</code><code># find  -mmin 1 | xargs rm -rf</code>

<code>[root@localhost tmp]</code><code># ls</code>

<code>#此處的-mmin 1表示修改時間到從1分鐘不到2分鐘之間的檔案删除,慎用,我剛才#就是+1,結果一分鐘之前的所有檔案就這麼沒了~~~~悲劇了!</code>

find |xargs COMMAND(查找大檔案很有用)

====================================完===================================================

本文轉自 jinlinger 51CTO部落格,原文連結:http://blog.51cto.com/essun/1363882,如需轉載請自行聯系原作者