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 15:02
下一篇 2017-11-08 19:09

相关推荐

  • FHS文件系统各目录及功能

    FHS即:filesystem hierarchy standard 的缩写,意思是文件系统目录标准,Linux系统采用这种文件组织形式,这是一种树形结构组织文件。如下图, /bin : 此文件用于放置二进制执行文件。 在/bin底下的指令可以被root与一般账号所使用,主要有:cat, chmod, chown, date, mv, mkdir,…

    Linux干货 2016-10-17
  • 20160804作业

    查出分区空间使用率的最大百分比值 查出用户UID最大值的用户名、UID及shell类型 查出/tmp的权限,以数字方式显示 统计当前连接本机的每个远程主机IP的连接数,并按从大到小排序 利用扩展正则表达式分别表示0-9、10-99、100-199、200-249、250-255        &nb…

    Linux干货 2016-08-08
  • 总考十分的学习宣言

    目标:按照学习线路图完成所有视频的学习,完成每一次的博客作业及云学堂考试,成功转型互联网运维。 宣言:我一定要转型互联网运维工程师,并在这个领域不断坚持耕耘下去,成为行业的专家,拿高薪,挣so much money,可以有钱去看看世界,去台湾环岛,去日本爬天空树,去北欧看极光,去南极看企鹅,去看盐湖和大象,去非洲看动物迁徙。一生的时间是有限的,在有限的时间里…

    Linux干货 2016-10-24
  • 无网不利

                    网络是主机之间交互的必备条件。联网就是将主机互联来形成网络,使得网络中的主机得以交换信息。       &n…

    2017-08-19
  • 8.3-ACL权限详解(命令篇)

    前言         我们都知道Linux有三种身份(owner,group,other)搭配三种权限(r,w,x)以及三种特殊权限(SUID,SGID,SBIT), 但是某些时候这些组合不能满足复杂的权限需求。 例如      …

    Linux干货 2016-08-04
  • 基础指令的使用篇3 Linux版

    / /boot /bin /sbin /lib.modules /lib64 /etc/redhat-release /etc/centos-release /home/zczx /mnt /media /misc /proc/meminfo /proc/cpuinfo /proc/partition /sya /opt /tmp /usr/local/ /…

    Linux干货 2016-08-04