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

相关推荐

  • linux 文件管理类命令及功能用法

    第一题:Linux上的文件管理类命令都有哪些,其常用的使用方法及相关示例演示。 文件管理类的命令有: cd,ls,touch,mldir,cp,mv,rm,rmdir,pwd,tree 使用方法 (1),cd命令用来切换工作目录至dirname。其中dirName表示法可为绝对路径或相对路径。 常用格式: cd #进入用户家目录 cd~ #进入用户家目录 c…

    Linux干货 2017-07-09
  • bash 函数

        函数可以让多条shell的命令组成语句块,实现代码重用和模块化编程。让我们在不用重复编写一些脚本,下面让我们来了解函数。 1,函数的简介 函数在脚本中使用应先定义,声明,再可以调用。 函数function 是由若干条shell 命令组成的语句块,实现代码重用和模块化编程。 函数与shell 程序形式上是相似的,…

    Linux干货 2016-08-24
  • 第十三周作业

    “1、建立samba共享,共享目录为/data,要求:(描述完整的过程)   1)共享名为shared,工作组为magedu;   2)添加组develop,添加用户gentoo,centos和ubuntu,其中gentoo和centos以develop为附加组,ubuntu不属于develop组;密码均为用户名; …

    Linux干货 2017-08-13
  • 第八周练习脚本部分

    1、写一个脚本,使用ping命令探测172.16.250.1-172.16.250.254之间的所有主机的在线状态;在线的主机使用绿色显示;不在线的主使用红色显示; #!/bin/bash # for((i=1;i<=254;i++));do     site="172.16.250.${i}&quot…

    Linux干货 2016-12-15
  • Java构造时成员初始化的陷阱

    让我们先来看两个类:Base和Derived类。注意其中的whenAmISet成员变量,和方法preProcess() public class Base {     Base() {         preP…

    Linux干货 2015-04-03
  • LB Cluster 负载均衡集群 —-lvs 配置详解

    lvs : ipvs scheduler: 根据其调度时是否考虑各RS当前的负载状态,可分为静态方法和动态方法两种: 1、静态方法:仅根据算法本身进行调度; RR:roundrobin,轮询; WRR:Weighted RR,加权轮询; SH:Source Hashing,实现session sticy,源IP地址hash;将来自于同一个IP地址的请求始终发…

    Linux干货 2016-10-30