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

相关推荐

  • 网络基础

    什么是计算机网络? 是指将地理位置不同的具有独立功能的多台计算机及外部设备,借助于某种网络介质连接起来,实现资源共享和信息传递的计算机系统 计算机网络的特点? 1、能实现数据信息的快速传输和集中处理 2、可共享计算机系统资源 3、提高了计算机的可靠性及可用性 4、能均衡负载互相协作 常见的网络应用程序 Web 浏览器(Chrome、IE、Firef…

    Linux干货 2016-09-09
  • Linux网络属性管理

    Linux网络属性管理 linux的网络配置方法有多种,而且随发行版及版本而略微不同。我目前的测试环境为CentOS6和CentOS7。 常用的网络配置命令或方法有:ifconfig,route,netstat,ip,ss,nmcli,配置文件。 首先:命令方法介绍 一、命令简介 ifconfig:是个比较传统的命令,可以配置网络接口的启用及关闭,IP地址等…

    系统运维 2016-05-29
  • lvm 逻辑卷 和 网络管理

    lvm 逻辑卷 和 网络管理 逻辑卷管理器(LVM) LVM:      Logical Volume Manager, Version: 2  dm: device mapper:     将一个或多个底层块设备组织成一个 逻辑设备的模块   设备名:     /dev/d…

    Linux干货 2016-09-01
  • 马哥教育网络班20期+第六周课程练习

    请详细总结vim编辑器的使用并完成以下练习题 1、复制/etc/rc.d/rc.sysinit文件至/tmp目录,将/tmp/rc.sysinit文件中的以至少一个空白字符开头的行的行首加#;     cp /etc/rc.d/rc.sysinit  /tmp   &n…

    Linux干货 2016-10-19
  • puppet学习笔记

      一、Puppet基础原理: Puppet是一款使用GPLV2X协议授权的开源管理配置工具,用ruby语言开发,既可以通过客户端—服务器的方式运行,也可以独立运行。puppet可以为系统管理员提供方便,快捷的系统自动化管理。   二、puppet工作流程 1. 客户端 puppet-client 向 puppet-maste…

    Linux干货 2015-11-04