一、前言:在linux系统中,比较常用的查找命令有两个,一个是locate,另外一个是find;locate命令运行时需要依靠后台索引的数据库,这个数据库文件位于/var/cache/locate/locatedb.但是这个数据库文件每天是通过cron自动更新的。假如你刚创建了一个文件,但是数据库并没有更新,那么你用locate是无法找到的。当然,也可以执行updatedb来手动更新,那未免就有点麻烦了。优点就是通过数据库查询查找速度比较快;find命令是一个实时查找、可以对查找内容进行精确匹配,但是速度比较慢的查找命令。

二、命令介绍

1、locate:

安装locate:

yum –y install  locate

更新locatedb数据库

updatedb

使用:

locate  shadow

p_w_picpath

从上图的查找来看,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

用数轴来表示时间和+、-之间的关系如下:

p_w_picpath

根据时间戳查找(使用方法与根据文件大小查找类似)

-atime:按访问时间查找(以天为单位)

-2:表示2天内被访问过

+2:表示2天前被访问过

2:表示正好2天前被访问过

-mtime:以修改时间查找(以天为单位)

-ctime:以改变时间查找(以天为单位)

-amin:按访问时间查找(以分钟为单位)

-mmin:以修改时间查找(以分钟为单位)

-cmin:以改变时间查找(以分钟为单位)

以数轴方式表达:

p_w_picpath

根据文件权限进行查找

-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命令是非常好用的查找命令,但是这个命令也有很诡异的地方,让人理解起来比较费解。总之,多用多练就会很熟悉的掌握它。