一、前言:在linux系统中,比较常用的查找命令有两个,一个是locate,另外一个是find;locate命令运行时需要依靠后台索引的数据库,这个数据库文件位于/var/cache/locate/locatedb.但是这个数据库文件每天是通过cron自动更新的。假如你刚创建了一个文件,但是数据库并没有更新,那么你用locate是无法找到的。当然,也可以执行updatedb来手动更新,那未免就有点麻烦了。优点就是通过数据库查询查找速度比较快;find命令是一个实时查找、可以对查找内容进行精确匹配,但是速度比较慢的查找命令。
二、命令介绍:
1、locate:
安装locate:
yum –y install locate
更新locatedb数据库
updatedb
使用:
locate shadow
从上图的查找来看,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用数轴来表示时间和+、-之间的关系如下:
根据时间戳查找(使用方法与根据文件大小查找类似)
-atime:按访问时间查找(以天为单位)
-2:表示2天内被访问过
+2:表示2天前被访问过
2:表示正好2天前被访问过
-mtime:以修改时间查找(以天为单位)
-ctime:以改变时间查找(以天为单位)
-amin:按访问时间查找(以分钟为单位)
-mmin:以修改时间查找(以分钟为单位)
-cmin:以改变时间查找(以分钟为单位)
以数轴方式表达:
根据文件权限进行查找
-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 ./c2、查找/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 ./b2、接上题,这次将这些文件的权限改为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 ./dexec
[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命令是非常好用的查找命令,但是这个命令也有很诡异的地方,让人理解起来比较费解。总之,多用多练就会很熟悉的掌握它。