find详解(Blog 2)

find与locate特性、find命令

find 文件查找工具

\ > Linux资深运维工程师必会文件查找工具之一

查找:在文件系统上,按某种条件,查找符合条件的文件;并非是文本内容过滤(grep)

文件系统:倒置的树状结构;管理文件;

文件:有边界的在磁盘上的一段流式数据;

linux上文件查找工具实现:locate, find

locate工具:根据事先构建的索引库查找;

  • 速度快:查找数据库完成;类似whatis查找方式;
  • 模糊查找:文件系统中的某个路径中存在此字串即符合;
  • 非实时查找:查找到的内容只能是构建数据库那一刻之前所有的内容;

\ > 查找时性能好,但构建索引库需要遍历整个根文件系统,极消耗资源;


locate命令使用:

locate [OPTION]… PATTERN…


-b 仅匹配路径中的基名;
-c, --count: 统计显示符合条件的文件数量
-r, --regexp REGEXP:使用BRE编写模式;
  • 搜索文件系统上passwd文件;
    ~]# locate -b -r "^passwd$" 
    /etc/passwd
    /etc/pam.d/passwd
    /usr/bin/passwd
    /usr/share/bash-completion/completions/passwd                                   
    统计,以上查找文件的数目:
    ~]# updatedb

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

  • 速度略慢:在用户给定的指定目录下进行遍历查找
  • 精确查找:匹配路径的基名;且精确匹配;
  • 实时查找:查找文件是此刻文件的状态;

ps:现在硬件越强,查找精确性足以抵消查找速度降低的时间。

find命令使用:

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


  • OPTION: -maxdepth:查找指定起始路径下的路径深度;
  • 查找起始路径:指定具体搜索目标起始路径;默认为当前目录;
  • 查找条件:指定查找标准;默认找出指定路径下所有文件;(目录也是文件)
  • 处理动作:对符合条件的文件做出的操作;默认显示至标准输出;

查找条件:

文件名:

基名匹配: glob

 -name "GLOB"
 -iname "GLOB"

完整路径名匹配: REGEX

-regex "PATTERN"
-iregex "PATTERN"

查找/etc起始路径下passwd的所有文件;

[root@localhost ~]# find /etc -name "passwd"
/etc/passwd
/etc/pam.d/passwd

查找文件系统下包含shadow的所有文件:

[root@localhost ~]# find / -regex ".*shadow.*"
/usr/share/doc/shadow-utils-4.1.5.1/NEWS

从属关系:

查找属主为指定用户的所有文件;

-user USERNAME

属组为指定组

-group GROUPNAME

查找属主为指定UID的所有文件;

-uid UID

属组为指定UID

-gid GROUPID

没有属主的所有文件;

-nouser

没有属组的所有文件;

-nogroup

查找/tmp目录下属主为centos的所有文件:

[root@localhost ~]# find /tmp -user centos

查找/tmp目录下属组为fedora的所有文件;

[root@localhost ~]# find /tmp -group fedora

查找/tmp目录下属主为502的所有文件:

[root@localhost ~]# find /tmp -uid 502

查找/tmp目录下属组为520的所有文件:

[root@localhost ~]# find /tmp -gid 520

查找文件系统没有属主的所有文件:

[root@localhost ~]# find / -nouser

查找文件系统没有属组的所有文件:

[root@localhost ~]# find / -nogroup

类型:

普通文件,regular file;

-type f

目录文件,directory;

-type d

块设备文件,block;

-type b

字符设备文件,character;

-type c

链接文件,symbolic;

-type l

套接字文件,socket;

-type s

命名管道,pipe(name);

-type p

查找/tmp目录下所有目录文件;

[root@localhost ~]# find /tmp -type d

查找/etc目录下所有符号链接文件;

[root@localhost ~]# find /etc -type l

查找/dev目录下所有块设备;

[root@localhost ~]# find /dev -type b

组合:

与:-a,默认组合逻辑;同时满足条件才满足;


或:-o,被查找的文件,只要二者符合其中之一,即可满足条件;与-ls连用,需要将或的整体加 (A -o B)


非:-not, !


组合条件遵循“摩根定律”:


查找文件系统下不是root用户的所有文件:

[root@localhost ~]# find / ! -user root

查找文件系统下不是mygrp组的所有文件:

[root@localhost ~]# find / ! -group mygrp -ls

查找文件系统下不是root用户,且不是mygrp组的所有文件:

[root@localhost ~]# find / ! -user root -a ! -group mygrp -ls
可以写作:[root@localhost ~]# find / ! \( -user root -o -group mygrp \) -ls

查找文件系统下没有属组或属主的所有文件:

[root@localhost ~]# find / \( -nogroup -o -nouser \) -ls 
[root@localhost ~]# find / -nogroup -o -nouser -ls
注意:加括号匹配整体,不加括号只匹配-nouser条件;

找出/tmp目录下属主为非root,而且文件名不包含fstab字符串的文件;

[root@localhost ~]# find /tmp -not \(  -user root -o  -name "passwd" \) -ls

根据文件大小查找:

精确查找;(#-1,#]

-size #[KMG]

小于指定值[0,#-1]

-size -#[KMG]

大于指定值(#,+无穷)

-size +#[KMG]

查找/tmp目录下为1k的所有文件

[root@localhost ~]# find /tmp -size 1k -ls
注意:对应目录下文件不足1k也会显示

根据时间戳查找:以”天”为单位:

距离现在有#天; (#+1,#]

-atime # 或 -mtime #

-#: 距离现在小于#天;(#,至今]

-atime -# 或 -mtime -#

+#: 距离现在大于#天:(负无穷,#+1]

-atime +# 或 -mtime +#

查找/tmp目录下7天内访问过所有文件:

[root@localhost ~]# find /tmp -atime -7 -ls

根据时间戳查找:以”分钟”为单位:

距离现在有#分钟; (#+1,#]

-amin # 或 -mmin #

-#: 距离现在小于#分钟;(#,至今]

-amin # 或 -mmin -#

+#: 距离现在大于#分钟:(负无穷,#+1]

-amin # 或 -mmin +#

24小时(86400秒)内修改过:

# find /etc -mtime -1

查找/tmp目录下30分钟内修改过的所有文件;

[root@localhost ~]# find /tmp -mmin -30 -ls

根据权限查找:

至少为此权限;

-perm -MODE

满足三类用户的一位权限,即可;

-perm /MODE 
666: rw-rw-rw- 表示:属主有r或w即满足,属组有r或w即满足,其他有r或w即满足
\> r--------: 属主有r,满足;
\> ----w----: 属组有w,满足;

精确匹配;

-perm MODE

查找/etc目录下都有执行权限的普通文件;

[root@localhost ~]# find /etc -perm -111 -a -type f

查找/etc目录下都没有执行权限的目录:

[root@localhost ~]# find /etc ! -perm  /111 -a -type d -ls

查找/etc目录下至少有一类用户有写权限的所有文件;

[root@localhost ~]# find /etc -perm  /222  -ls

查找/etc目录下至少有一类用户没有写权限的所有文件;

[root@localhost ~]# find /etc ! -perm  -222  -ls

处理动作:

-print:默认动作;显示输出至标准输出;

[root@localhost ~]# find
[root@localhost ~]# find -print

-ls: 类似于对查找到的文件执行”ls -l”命令,输出文件的详细信息;

注意:或条件时仅显示ls前的条件;
[root@localhost ~]# find /tmp  \( -nouser -o -nogroup \)  -ls

-delete: 删除查找到的文件;

[root@localhost ~]# find /tmp  \( -nouser -o -nogroup \)  -delete

-fls /PATH/TO/SOMEFILE: 把查找到的所有文件的长格式信息保存至指定文件中;

[root@localhost ~]# find /  \( -nouser -o -nogroup \)  -fls /root/find.fls

-ok COMMAND {} \; :表示对查找到的每个文件执行由此处COMMAND表示的命令;每次操作都由用户进行确认;

[root@localhost ~]# find /  \( -nouser -o -nogroup \)  -ok rm {} \;
< rm ... /home/fedora > ? y
rm: cannot remove ‘/home/fedora’: Is a directory

-exec COMMAND {} \; :表示对查找到的每个文件执行由此处COMMAND表示的命令;

{} 引用找到的每一行(文件的文件名)
\; 固定格式
    # find . -perm -002 -exec mv {} {}.danger \;
    注意:find传递查找到的文件路径至后面的命令时,是先查找出符合条件的文件路径,并一次性传递给后面的命令;
    但有些命令不能接受过长的参数,此时命令执行会失败,另一种方式可规避此问题;
    find | xargs -I {} COMMAND {}

1、查找/var目录下属主为root,且属组为mail的所有文件或目录;

# find /var -user root -a -group mail

2、查找/usr目录下不属于root, bin或hadoop的所有文件或目录;用两种方法;

# find /usr -not \( -user root -o -user bin -o -user hadoop \)
# find /usr -not -user root -a ! -user bin -a ! -user hadoop

3、查找/etc/目录下最近一周内其内容修改过,且属主不是root用户也不是hadoop用户的文件或目录;

# find /etc -mtime -7 -a ! -user root -a ! -user hadoop

4、查找当前系统上没有属主或属组,且最近一周内曾被访问过的文件或目录;

# find / -nouser -o -nogroup -a -atime -7

5、查找/etc目录下大于1M且类型为普通文件的所有文件

# find /etc -size +1M -a -type f -exec ls -lh {} \;

6、查找/etc目录下所有用户都没有写权限的文件;

# find /etc ! -perm /222 -a -type f
    都有:-222
    都没有:加否定,且变或! /222

7、查找/etc目录至少有一类用户没有执行权限的文件;

# find /etc ! -perm -111 -a type f
    至少有一类用户有执行:/111
    加否定,或变且:! -111

8、查找/etc/init.d/目录下,所有用户都有执行权限,且其它用户有写权限的所有文件;

# find /etc/init.d -perm -113 -a -type f

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/88251

(1)
逆神阳逆神阳
上一篇 2017-11-07
下一篇 2017-11-08

相关推荐

  • 软件编译安装小结

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://nolinux.blog.51cto.com/4824967/1439073     本文主要针对 configure 和 cmake 做一个介绍以及我们重新配置编译参数文件时,都需要做哪些清…

    Linux干货 2016-08-15
  • 习题

    1.当用户xiaoming对/testdir 目录无执行权限时,意味着无法做哪些操作? 2.当用户xiaoqiang对/testdir 目录无读权限时,意味着无法做哪些操作? 3.当用户wangcai 对/testdir 目录无写权限时,该目录下的只读文件file1是否可修改和删除? 4.复制/etc/fstab文件到/var/tmp下,设置文件所有者为wa…

    Linux干货 2016-08-04
  • linux运维

    linux运维大纲,学习路线图

    Linux干货 2017-10-21
  • 1.初识linux

    1.计算机组成 计算机五大部件:运算器、控制器、存储器、输入设备、输出设备。对应实际情况大致如下: CPU CPU(Central Processing Unit)主要包含运算器、控制器;也包含寄存器、缓存用于辅助: CPU在同一时间能并行处理的二进制数的位数称为CPU字长。字长由CPU对外数据通路的数据总线条数决定。 运算器 运算器也称…

    Linux干货 2016-08-22
  • LVM逻辑卷管理器

    Logical Volume Manager     LVM(逻辑卷管理)是Linux环境下对磁盘分区进行管理的一种机制。     普通的磁盘分区管理方式在逻辑分区划分好之后就无法改变其大小,     某个分区空间耗尽时,解决的方法通常是使…

    Linux干货 2016-08-29
  • 一起学DNS系列(十四)DNS查询工具之DIG的使用(2)

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://jeffyyko.blog.51cto.com/28563/240243    上节谈到了利用DIG的+trace参数追踪域名解析的过程,其实除此之外,DIG还有一些其他的参数,这节会涉及到这…

    2015-03-17