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 \;

 

posted @ 2018-08-07 11:21  独孤柯灵  阅读(208)  评论(0编辑  收藏  举报