Jeff Notes

find命令详解

系统版本:

[root@node1 ~]# cat /etc/redhat-release 
CentOS Linux release 7.1.1503 (Core) 
[root@node1 ~]# uname -r
3.10.0-229.el7.x86_64

find

实时查找工具,通过遍历指定起始路径下文件系统层级结构完成文件查找。

工作特性

用法

find [OPTIONS] [查找起始路径] [查找条件] [处理动作]

查找条件:文件名


选项:

注:“pattern”支持glob风格的通配符,如:*,?,[],[^]

示例:

[root@node1 ~]# find /etc/ -iname "passwd"
#精确匹配查找文件名为“passwd”的文件,但不区分大小写
[root@node1 ~]# find /etc/ -iname "passwd*"
#查找以“passwd”开头的文件,不区分大小写

[root@node1 ~]# mkdir /etc/test
[root@node1 ~]# touch /etc/test/passwdx
[root@node1 ~]# find /etc -iname "passwd[[:alnum:]]"

 

查找条件:文件从属关系


选项:

示例:

[root@node1 ~]# find /tmp/ -user moosefs
[root@node1 ~]# find /tmp/ -group moosefs
[root@node1 ~]# find /tmp/ -uid 3003
[root@node1 ~]# find /tmp/ -gid 3004

 

查找条件:文件类型


-type TYPE:

示例:

[root@node1 ~]# find /dev -type b -ls
[root@node1 ~]# find /etc -type l -ls
#“-ls”表示“[处理动作]”

 

组合测试


示例:

[root@node1 ~]# find /tmp/ -nouser -type f -ls
or [root@node1 ~]# find /tmp/ -nouser -a -type f -ls
#必须符合两个条件“-nouser”和“-type f”

[root@node1 ~]# find /tmp/ -not -type f -ls
or [root@node1 ~]# find /tmp/ ! -type f -ls

[root@node1 ~]# find /tmp/ -not -user root -a -not -iname "*fstab*" -ls
or [root@node1 ~]# find /tmp/ -not ( -user root -o -iname "*fstab*" ) -ls
#找出/tmp目录下属主为非root,而且文件名不包含fstab字符串的文件
#第二种方式用括号括起来,原来的-a要改成-o,如果是-o,则要改成-a

 

查找条件:文件大小


-size [+|-]#UNIT
常用单位:K, M, G

查找条件:时间戳


以“天”为单位的选项:

以“分钟”为单位的选项:

选项后面跟值:
-atime [+|-]#
注:把#看成负数,因为这里的时间指过去时

示例:

[root@node1 ~]# find /etc -atime +7 -ls
#查找7天之前访问过的文件
[root@node1 ~]# find /etc -mtime -1 -ls
#查找1天之内修改过的文件

 

查找条件:权限


-perm [/|-]mode

示例:

[root@node1 ~]# cd /tmp/
[root@node1 tmp]# touch a b c d e f g
[root@node1 tmp]# chmod 640 a
[root@node1 tmp]# chmod 666 b
[root@node1 tmp]# chmod 440 c
[root@node1 tmp]# chmod 775 d
[root@node1 tmp]# chmod 777 e

[root@node1 tmp]# find ./ -perm 644 -ls
#精确匹配查找权限为644的文件

[root@node1 tmp]# find ./ -perm /666 -ls
#至少有一类权限位有r或w(注意:这里是“或”),即符合条件
[root@node1 tmp]# find ./ -perm /111 -ls
#至少有一类权限位有x,即符合条件
[root@node1 tmp]# find ./ -perm /002 -ls
#不看属主和属组权限,匹配其他用户包含w权限的文件
#其他用户具有w权限的文件危险性很高,一般不设定其他用户具有w权限
[root@node1 tmp]# find ./ -perm -002 -ls
#这个结果和上面一条相同,因为忽略属主和属组部分
[root@node1 tmp]# find ./ -perm /022 -ls
#只要属组和其他用户当中,有一类有w权限,即匹配
[root@node1 tmp]# find ./ -perm -022 -ls
#属组和其他用户必须同时拥有w权限的文件

[root@node1 tmp]# find ./ -perm /222 -ls
#至少有一类权限位有w,即符合条件
[root@node1 tmp]# find ./ -not -perm /222 -ls
#任何用户都没有w,即符合条件

[root@node1 tmp]# find ./ -perm -222 -ls
#匹配所有用户都有w权限的文件
[root@node1 tmp]# find ./ -not -perm -222 -ls
#匹配至少有一类用户没有w权限的文件

#至少有一类用户有权限的反义:任何用户都没有权限
#所有用户都有权限的反义:至少有一类用户没有权限

 

处理动作


示例:

[root@node1 tmp]# useradd centos
[root@node1 tmp]# chown centos:centos c e
[root@node1 tmp]# userdel -r centos
[root@node1 tmp]# find ./ -nouser -a -nogroup
#查找没有属主也没有属组的文件
[root@node1 tmp]# find ./ -nouser -a -nogroup -ok chown root:root {} ;
#将没有属主也没有属组的文件,属主和属组都改为root

[root@node1 tmp]# find ./ -perm /002 -exec mv {} {}.danger ;
#将其他用户具有w权限的文件改名加上danger标记

 

xargs


在使用 find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。

xargs从find命令接收并传递参数,配合管道符|来使用,把find命令的stdout作为自己的stdin,再转换成command line形式的参数传给其它命令。
 
语法:

find [options] | xargs [options] [TargetCommand [options]]

选项:

示例:

[root@node1 ~]# find . -type f -name "*.log" -print0 | xargs -0 rm -f
# 将当前目录下以“.log”结尾的普通文件删除
# xargs解决/bin/rm Argument list too long的问题

# “-print0”和“xargs -0”,xargs默认以空白字符(空格,TAB,换行符)来分割记录,
# 假如find得到的文件名中含有空格,xargs将不能正常处理;
# 因此,“-print0”表示让find在打印出一个文件名之后,接着输出一个NULL字符“ ”,
# xargs后面的“-0”则告诉xargs也使用NULL字符作为分隔符,
# 这样就解决了xargs不能正常处理含有空格的文件名的问题

[root@node1 ~]# find . -perm -7 -print | xargs chmod o-w
# 在当前目录下查找其他用户具有rwx权限的文件,并收回相应的w权限

[root@node1 ~]# find . -type f -atime +0 -print0 | xargs -0 -l1 -t rm -f
# 将当前目录下在24小时之前(包含24小时)访问过的普通文件删除

[root@node1 ~]# find . -name "*.log" | xargs -p -i mv {} test4
or [root@node1 ~]# find . -name "*.log" | xargs -p -I [] mv [] test4
# 将当前目录下以“.log”结尾的文件移动到“test4”目录