Linux基礎之find命令

一、前言:在linux系統中,比較常用的查找命令有兩個,一個是locate,另外一個是find;locate命令運行時需要依靠後臺索引的數據庫,這個數據庫文件位於/var/cache/locate/locatedb.但是這個數據庫文件每天是通過cron自動更新的。假如你剛創建了一個文件,但是數據庫並沒有更新,那麼你用locate是無法找到的。當然,也可以執行updatedb來手動更新,那未免就有點麻煩了。優點就是通過數據庫查詢查找速度比較快;find命令是一個實時查找、可以對查找內容進行精確匹配,但是速度比較慢的查找命令。

二、命令介紹

1、locate:

安裝locate:

yum –y install  locate

更新locatedb數據庫

updatedb

使用:

locate  shadow

image

從上圖的查找來看,locate查找速度很快,但是並不能精切的查找,所以用的多還是find命令。

2、find

用法: find [查找位置] [查找標準] [處理動作]

查找標準:

根據文件名進行查找:

-name “文件名稱”:根據文件名查找,支持字符匹配

[root@myb362 ~]# find / -name "shadow"
/etc/shadow
/tmp/etc/shadow

-iname  “文件名稱”:根據文件名查找,不區分字符大小寫

[root@myb362 ~]# find -iname "A.sh"
./A.Sh
./A.sh
./A.SH
./a.sh

根據文件屬性查找

-user UserName :根據屬主查找

[root@myb362 ~]# find . -user myb
./A.sh
./a.sh

-group GroupName:根據屬組查找

[root@myb362 ~]# find . -group myb
./A.sh
./a.sh

-uid UID:根據UID查找

[root@myb362 ~]# find -uid 2001
./A.SH

-gid GID:根據gid查找

[root@myb362 ~]# find / -gid 499
/var/lib/ntop
/var/lib/ntop/rrd
/var/lib/ntop/rrd/flows

-nouser:查找沒屬主的文件

[root@myb362 ~]# find / -nouser
/root/htop-1.0.2
/root/htop-1.0.2/SwapMeter.h
/root/htop-1.0.2/ClockMeter.c

-nogroup:查找沒有屬組的文件

[root@myb362 ~]# find /tmp -nogroup
/tmp/test.txt
/tmp/test.txt2

 

根據文件類型查找

-type

f:普通文件

d:目錄

b:塊設備

c:字符設備

l:符號鏈接

p:命名管道

s:套接字文件

根據文件大小查找

-size

常用單位:

 k  

M

G

例如:2M,包含1M到2M的所有文件

+2M,大於2M的文件

-2M,小於2M的文件

首先通過dd命令在一個空目錄下創建幾個文件

dd  if=/dev/zero of=/find/a bs=512k count=1 這是創建一個512k的文件a,創建其他大小,只需要修改count的值即可,例如創建5M,count=10

[root@myb362 find]# du -sh *
512K    a
2.0M    abc
1.0M    b
5.0M    c
6.0M    d
1.5M    f

查找大小爲2M的文件

[root@myb362 find]# find . -size 2M
./abc
./f

查找大於2M的文件

[root@myb362 find]# find . -size +2M
./c
./d

查找小於2M的文件

[root@myb362 find]# find . -size -2M
.
./a
./b

用數軸來表示時間和+、-之間的關係如下:

image

根據時間戳查找(使用方法與根據文件大小查找類似)

-atime:按訪問時間查找(以天爲單位)

-2:表示2天內被訪問過

+2:表示2天前被訪問過

2:表示正好2天前被訪問過

-mtime:以修改時間查找(以天爲單位)

-ctime:以改變時間查找(以天爲單位)

-amin:按訪問時間查找(以分鐘爲單位)

-mmin:以修改時間查找(以分鐘爲單位)

-cmin:以改變時間查找(以分鐘爲單位)

以數軸方式表達:

image

根據文件權限進行查找

-perm [+|-] MODE:權限匹配

沒有[+|-]:表示精確匹配權限

+MODE:任何一類用戶的任何一位權限匹配即可

-MODE:每類用戶的權限都匹配

剛開始有點蒙,慢慢理就會有頭緒了

        要查找的文件權限如下

[root@myb362 find]# ls -al
total 16392
drwxr-xr-x. 2 root root    4096 Apr  6 04:46 .
dr-xr-x---. 9 root root    4096 Apr  6 04:20 ..
-rwxr-xr-x. 1 root root  524288 Apr  6 04:21 a
-rw-r--r--. 1 root root 2097152 Apr  6 04:21 abc
-rw-r--r--. 1 root root       0 Apr  6 04:46 a.txt
-rw-r--r--. 1 root root 1048576 Apr  6 04:21 b
---x--x--x. 1 root root 5242880 Apr  6 04:21 c
-rw---x--x. 1 root root 6291456 Apr  6 04:21 d
-rw-r--r--. 1 root root 1572864 Apr  6 04:26 f

首先:查找文件權限類型爲755的文件

[root@myb362 find]# find . -perm 755
.
./a

這裏可以看到是精確匹配權限,別忘了.是當前目錄,權限也是755

接着:查找有執行權限的文件

[root@myb362 find]# find . -perm +111
.
./a
./c
./d

這裏可以看到,只要有任意一類用戶有執行權限就會列出這個文件

最後:查找所有用戶都有執行權限的文件

[root@myb362 find]# find . -perm -111
.
./a
./c

好了,看到了吧。只有所有用戶都有執行權限的文件纔會被列出來

組合查找條件:

-a:與

-o:或

-not,!:非

例如:

1、查找文件小於2M並且所有用戶都有執行權的文件

[root@myb362 find]# find . -size +2M -a -perm -111
./c

2、查找/usr目錄下不屬於root,bin或者myb的文件

find /usr –not –user root –a –not –user bin –a –not myb

或者

find /usr –not \(-user root –o –user bin –o –user myb\)

 

處理動作:

-print:顯示

-ls:顯示查找到的文件的詳細信息

-exec {} \; 

解釋-exec {} 表示命令的參數即爲所找到的文件,以;表示command命令的結束。\是轉義符,因爲分號在命令中還有其他用途,所以就用一個\來限定表示這是一個分號而不是其他意思。

-ok {} \;  :交互式的-exec,是一種比較安全的模式執行,每次都會給出提示,讓用戶選擇是否執行

例如:

1、查找剛纔那個目錄下的小於2M的文件並列出詳細信息

[root@myb362 find]# find . -size -2M -ls
656263    4 drwxr-xr-x   2 root     root         4096 Apr  6 04:46 .
656265  512 -rwxr-xr-x   1 root     root       524288 Apr  6 04:21 ./a
656270    0 -rw-r--r--   1 root     root            0 Apr  6 04:46 ./a.txt
656266 1024 -rw-r--r--   1 root     root      1048576 Apr  6 04:21 ./b

2、接上題,這次將這些文件的權限改爲755然後列出詳細信息

[root@myb362 find]# find . -size -2M -exec chmod 755 {} \; -ls
656263    4 drwxr-xr-x   2 root     root         4096 Apr  6 04:46 .
656265  512 -rwxr-xr-x   1 root     root       524288 Apr  6 04:21 ./a
656270    0 -rwxr-xr-x   1 root     root            0 Apr  6 04:46 ./a.txt
656266 1024 -rwxr-xr-x   1 root     root      1048576 Apr  6 04:21 ./b

其實,在find命令中,除了-exec 可以對符合條件的文件執行所給的linux命令,還有另外一個命令也可以實現這種功能,那就是xargs

xargs要結合管道來完成操作

用法:find [查找位置] [查找標準] |xargs command

上邊第二題用xargs處理就會是這樣

find . –size –2M | xargs chmod 755 | ls –l 

但是,這次ls-l要放到後邊並且通過管道執行了。

-exec和xargs的區別

從上面的操作,我們發現exec和xargs都可以完成參數傳遞,那麼誰更好一些呢?

首先,我們看一下exec和xargs是如何傳遞參數的,還以上邊的目錄爲例

xargs

[root@myb362 find]# find . -type f |xargs echo
./abc ./a ./f ./c ./a.txt ./b ./d

exec

[root@myb362 find]# find . -type f -exec echo {} \;
./abc
./a
./f
./c
./a.txt
./b
./d

從輸出結果來看:

exec是對每個找到的文件執行一次命令,除非單個文件的文件名非常大,否則是不會出現命令行超長報錯的;

xargs是把所有的文件一起轉給命令,如果文件非常的多,那麼這些文件名組合成的命令行參數會非常長,很容易報錯。

另外:find|xargs在處理有空格字符的文件名時也會報錯,因爲這時執行的命令已經不知道哪些是分隔符,哪些是文件名中的空格了。但是exec不會出現這樣的問題。

exec與xargs對比:

1、exec每處理一個文件或者目錄,都需要啓動一次命令,效率比較低

2、exec 格式麻煩,不如xargs簡便

3、xargs不能操作文件名有空格的文件

4、xargs在文件比較多的時候容易報錯

綜上,如果要使用的命令支持一次處理多個文件,並且也知道這些文件裏沒有帶空格的文件,     
那麼使用 xargs比較方便; 否則,就要用 exec了。

總結:find命令是非常好用的查找命令,但是這個命令也有很詭異的地方,讓人理解起來比較費解。總之,多用多練就會很熟悉的掌握它。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章