find命令
命令简介
find 命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。其工作特点如下:
- 查找速度略慢
- 精确查找
- 实时查找
- 可能只搜索用户具备读取和执行权限的目录
命令语法
find [OPTION]... [查找路径] [查找条件] [处理动作]
- 查找路径:指定具体目标路径;默认为当前目录
- 查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件
- 处理动作:对符合条件的文件做操作,默认输出至屏幕
查找路径
指定具体目标路径,默认为当前路径
查找条件
1. 指定搜索层级
-maxdepth LEVEL 最大搜索目录深度
-mindepth LEVEL 最小搜索目录深度
示例
找出根目录下的所有文件夹
[root@centos7 ~]# find / -mindepth 1 -maxdepth 1
2. 根据文件名和inode查找
-name "文件名称" : 支持使用glob -iname"文件名称" : 不区分字母大小写 -inum N : 按inode号查找 -samefile NAME : 相同inode号的文件 -links N : 链接数为n的文件 -regex “PATTERN” : 以PATTERN匹配整个文件路径,而非文件名称
示例
找出/etc 下以 passwd 开头的目录或文件
[root@centos7 ~]# find /etc -name "passwd*"
找出 / 下 inode 为 64 的目录或文件
[root@centos7 ~]# find / -inum 64
找出 /etc/profile.d 目录下以 .sh 结尾的目录或文件
[root@centos7 ~]# find /etc/profile.d -regex ".*sh$"
3.根据属主,属组条件查找
-user USERNAME : 查找属主为指定用户(UID)的文件 -group GRPNAME : 查找属组为指定组(GID)的文件 -uid UserID: 查找属主为指定的UID号的文件 -gid GroupID: 查找属组为指定的GID号的文件 -nouser: 查找没有属主的文件 -nogroup: 查找没有属组的文件
示例
找出 / 下既没有属主也没有属组的目录或文件
[root@centos7 ~]# find / -nouser -nogroup
4. 根据文件类型查找
-type TYPE:
f: 普通文件
d: 目录文件
l: 符号链接文件
s:套接字文件
b: 块设备文件
c: 字符设备文件
p: 管道文件
-empty : 空目录或文件
示例
找出 /app 下的空目录
[root@centos7 ~]# find /app -type d -empty
5.组合条件
与: -a 或: -o 非: -not, !
德·摩根定律
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
找出 /tmp 目录下,属主不是 root ,且文件名不以 f 开头的文件,以下两种写法是等价的
[root@centos7 ~]# find /tmp \( -not -user root -a -not -name 'f*' \) [root@centos7 ~]# find /tmp -not \( -user root -o -name 'f*' \)
6.排除目录
-prune : 排除的路径参数必须紧跟着搜索的路径之后,否则该参数无法起作用
示例
查找 /etc 下,除 /etc/sane.d 目录的其它所有 .conf 后缀的文件
[root@centos7 ~]# find /etc -path "/etc/sane.d" -prune -o -name "*.conf"
查找 /etc 下,除 /etc/sane.d 和 /etc/fonts 两个目录的所有 .conf 后缀的文件
[root@centos7 ~]# find /etc \( -path "/etc/sane.d" -o -path "/etc/fonts" \) -a -prune -o -name "*.conf"
7. 根据文件大小来查找
-size [+|-]#UNIT 常用单位:k, M, G,c(byte) #UNIT : (#-1, #] , 如 6k 表示(5k,6k] -#UNIT:[0,#-1] , 如 -6k 表示[0,5k] +#UNIT:(#,∞) , 如 +6k 表示(6k,∞)
示例
准备如下文件(可以用 dd 命令生成)
[root@centos7 ~]# ll -h /tmp/f* -rw-r--r-- 1 root root 4.5K Aug 7 09:33 /tmp/f1 -rw-r--r-- 1 root root 5.0K Aug 7 09:33 /tmp/f2 -rw-r--r-- 1 root root 5.5K Aug 7 09:34 /tmp/f3 -rw-r--r-- 1 root root 6.0K Aug 7 09:34 /tmp/f4 -rw-r--r-- 1 root root 6.5K Aug 7 09:35 /tmp/f5 -rw-r--r-- 1 root root 7.0K Aug 7 09:35 /tmp/f6
分别用 6k ,-6k,+6k 看看
[root@centos7 ~]# find /tmp/f* -size 6k /tmp/f3 /tmp/f4 [root@centos7 ~]# find /tmp/f* -size -6k /tmp/f1 /tmp/f2 [root@centos7 ~]# find /tmp/f* -size +6k /tmp/f5 /tmp/f6
8. 根据时间戳来查找
以“天”为单位
-atime [+|-]#
#: [#,#+1) ,如 6 表示 [6,7)
-#: [0,#),如 -6 表示 [0,6)
+#: [#+1,∞] ,如 +6 表示 [7,∞)
-mtime
-ctime
以“分钟”为单位
-amin
-mmin
-cmin
示例
准备如下文件
[root@centos7 ~]# touch -d "2018-07-31 00:00" /tmp/f1 [root@centos7 ~]# touch -d "2018-07-31 09:00" /tmp/f2 [root@centos7 ~]# touch -d "2018-08-01 00:00" /tmp/f3 [root@centos7 ~]# touch -d "2018-08-01 09:00" /tmp/f4 [root@centos7 ~]# touch -d "2018-08-02 00:00" /tmp/f5 [root@centos7 ~]# touch -d "2018-08-02 09:00" /tmp/f6
分别用 6 ,-6,+6 看看
[root@centos7 ~]# find /tmp/f* -atime 6 /tmp/f3 /tmp/f4 [root@centos7 ~]# find /tmp/f* -atime -6 /tmp/f5 /tmp/f6 [root@centos7 ~]# find /tmp/f* -atime +6 /tmp/f1 /tmp/f2
9. 根据权限查找
-perm [/|-]MODE MODE : 精确权限匹配 -MODE : 每一类对象都必须同时拥有指定权限 /MODE : 任何一类(u,g,o)对象的权限中只要能一位匹配即可,或关系,+ 从centos7开始淘汰
注意:这里的权限是实际权限,注意文件是否有acl权限设置
示例
准备如下文件
[root@centos7 ~]# ll /tmp/* -rw-rw-r-- 1 root root 4608 Aug 7 10:30 /tmp/f1 -rw-rw---- 1 root root 5120 Aug 7 10:30 /tmp/f2 -rw-r--r-- 1 root root 5632 Aug 7 10:30 /tmp/f3 -rw-r----- 1 root root 6144 Aug 7 10:30 /tmp/f4 -rw------- 1 root root 6556 Aug 7 10:30 /tmp/f5 -r-------- 1 root root 7168 Aug 7 10:30 /tmp/f6
分别用 644,-644, /644 看看
[root@centos7 ~]# find /tmp/f* -perm 644 /tmp/f3 [root@centos7 ~]# find /tmp/f* -perm -644 /tmp/f1 /tmp/f3 [root@centos7 ~]# find /tmp/f* -perm /644 /tmp/f1 /tmp/f2 /tmp/f3 /tmp/f4 /tmp/f5 /tmp/f6
处理动作
-print 默认的处理动作,显示至屏幕 -ls 类似于对查找到的文件执行“ls -l”命令 -delete 删除查找到的文件 -fls file 查找到的所有文件的长格式信息保存至指定文件中 -ok COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令,对于每个文件执行命令之前,都会交互式要求用户确认。{}表示引用查找到的文件名称自身
-exec COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令。{}表示引用查找到的文件名称自身
示例
查看 /home 的目录
[root@centos7 ~]# find /home -type d -ls
找出 /tmp 目录下权限为 644 的普通文件并删除之
[root@centos7 ~]# find /tmp -perm 644 -type f -ok rm {} \; < rm ... /tmp/f3 > ? y
备份/etc 下 以 .conf 结尾配置文件,添加 .orig 这个扩展名
[root@centos7 ~]# find /etc -name "*.conf" -exec cp {} {}.orig \;