linux文件查找工具 — find

简述:

  linux中find命令是一种强大的实时查找工具,它通过用户给出的路径,在该路径下的文件系统中进行文件查找。因此在遍历一个较大的文件系统时会比较花费时间,而且find命令占用资源也是比较大的,所以它的工作特点是,查找的速度略慢,但是可以实现精确查找和实时查找。由于用户权限的问题,可能只搜索用户具备读取和执行权限的目录。由于find命令能力很强大所以它的选项也有很多。


find命令用法:

find命令格式:

     find 【选项】 【查找起始路径】 【查找条件】 【处理动作】

     find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path…] [expression]

【选项】:[-H] [-L] [-P] [-D debugopts] [-Olevel]这几个并不常用,其中-H,-L,-P三个选项主要用来处理符号链接,

    -H表示只跟随命令行中指定的符号链接;

    -L表示跟随所有的符号链接;

    -P表示不跟随符号链接,默认选项;

【查找起始路径】:根据用户跟定的目标起始路径进行查找,默认是当前目录;

【查找条件】:根据用户指定的标准进行查找;默认是找出指定路径下的所有文件;

    查找条件大致分为以下几类:;

①根据文件名进行查找:

        -name;-iname

    如:查找当前目录下以“.cfg结尾的文件” 

~]# find . -name "*.cfg"

     此处匹配时glob通配符匹配不支持正则表达式。使用-iname可不区分字符大小写。

②根据inode号查找

    -inum n 查找inode号为n的文件

    -samefile f1 查找与文件f1相同inode号的文件

    -links n 链接数为n的文件

    -regex "PATTERN":以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称

~]# find -inum 1800 -ls
  1800    0 drwxr-xr-x   2 root     root            6 Aug  3 23:21 ./dir1

~]# find . -regex ".*\.sh$"
./scripts/a.sh
./scripts/arg.sh

③根据属主属组查找

    -user USERNAME:查找属主为指定用户(UID)的文件

    -group GRPNAME: 查找属组为指定组(GID)的文件

    -uidUserID:查找属主为指定的UID号的文件

    -gidGroupID:查找属组为指定的GID号的文件

    -nouser:查找没有属主的文件

    -nogroup:查找没有属组的文件

  如:查找/var目录下属主为root,且属组为mail的所有文件

~]# find /var -user root -group mail 
/var/spool/mail
/var/spool/mail/root

④根据文件类型查找:

    -type (f,d,l,c,b,p,s)

    f:普通文件

    d:目录文件

    l:符号链接文件

    c:字符设备文件

    b:块设备文件

    p:管道文件

    s:套接字文件

如:查找当前目录下的目录文件

~]# find -type d
.
./.ssh
./.cache
./.cache/abrt

⑤根据文件大小查找:

    -size [+/-]#UNIT  (#代表数字,UNIT代表单位)常用单位k,M,G

    #UNIT:(#-1,#] 表示大于#-1,小于等于#的区间

    -#UNIT:[0,#-1] 表示大于等于0,小于等于#-1的区间

    +#UNIT:(#,∞)表示大于#至正无穷的区间

  如:查找/etc目录行啊大于1M且类型为普通文件的所有文件

 ~]# find /etc/ -size +1M -type f
/etc/selinux/targeted/policy/policy.29
/etc/udev/hwdb.bin

⑥按时间戳查找:

    linux文件系统中每个文件都有三种时间戳,以天为单位,分别是:

  • 访问时间atime(access time),最后一次访问文件的时间;

  • 状态改变时间ctime(change time),最后一次改变文件的状态或属性的时间

  • 修改时间mtime(modity time),最后一次改变文件内容的时间

   -atime [+/-]# (#代表数字)

    -#:(#,0] 表示第#天前到现在的时间

    #:[#,#-1) 从第#天前到第#-1天之间的时间

     +#:(∞,#-1]表示包括第#-1天之前的时间

   -ctime [+/-]# 

   -mtime [+/-]#

17.png

还有一种一分钟为单位的表示时间,分别为-amin.-cmin,-mmin用法和atime之间完全一样,就不再举例说明。

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

 ~]# find / \( -nouser -o -nogroup \) -atime -7 -l

⑦根据权限查找:

   -perm [/|-]mode 

     /mode:表示任何一类用户(u,g,o)的权限中的任何一位(r,w,x)符合条件即满足条件;9位权限之间存在"或"的关系

如:只要当任意人有写权限时,find -perm /222就会匹配

    -mode:表示每一位用户的权限中的每一位同时符合条件即满足条件;9位权限之间存在"与"的关系

如:只有当每个人都有写权限时,find -perm -222才会匹配

 0表示不关注

如:只有当其它人(other)有写权限时,find- perm -002才会匹配

   -perm mode 表示精确匹配

如:find -perm 755 会匹配权限模式恰好是755的文件

⑧条件限制,组合使用,匹配多个

    与:-a 默认组合逻辑

    或:-o 

    非:-not或!

德·摩根定律:

非(P 且Q) = (非P) 或(非Q)

11.png

非(P 或Q) = (非P) 且(非Q)

12.png

所以:

!A -a !B = !(A -o B)

!A -o !B = !(A -a B)

如:查找/var目录下不属于root、lp、gdm的所有文件

13.png

14.png

可以看到两种情况是相等的

当find根据权限查找的时候,可以结合德·摩根定律来使用,前文已经提到 -perm /mode  9位权限之间存在"或"的关系,而-perm -mode权限之间存在"与"的关系。所以当权限查找结合德·摩根定律使用时。

! -perm /mode 即表示:所有用户都没有相应的权限;

! -perm -mode 即表示:至少有一种用户没有相应的权限;

如:

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

15.png

2、查找/root目录下至少有一种用户没有执行权限的文件

16.png

【处理动作】对符合查找条件的文件做出操作;默认为输出值标准输出。

    -print:输出至标注输出;默认动作

    -ls:类似与对查找到的文件执行ls-l命令。输出文件的详细信息

    -delete:删除查找到的文件

    -fls /path/to/somefile:把查找到的所有文件的长格式信息保持你至指定文件中

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

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

            注:{}表示匹配到的文件

如:查找/etc目录下一wd结尾的文件,并找出文件中含有root的行

 ~]# find /etc -name "*wd" -exec grep "root" {} \;

18.png

  但是在使用-exec选项时,find是将所有匹配到的文件一次性传递给exec执行,但是有些文件过长,可能会发生溢出错误。

  所以需要注意的是:find传递查找到的文件路径至后面的命令时,是先查找出所有符合条件的文件路径,并一次性传递给后面的命令;但有些命令不能接受过长的参数,此时命令执行会失败;我们可以使用另一种方式可规避此问题:find | xargs COMMAND

   在此简单说一下xargs命令,之所以能用到这个命令,主要实时由于很多命令不支持管道来传递参数,而平时工作又经常需要,所以有就有了xargs命令xargs是给命令传递参数的一个过滤器,也是组合多个个命令的一个工具。它把一个数据流分割为一些足够小的快,以方便命令进行处理。xargs从管道或者stdin中读取数据,并且以空白字符作为分割,所以,有一些包含空白字符的文件名或特殊意义到的名词时,容易发生误判。

 如:查找当前目录下以“.cfg结尾的文件” 并删除

 ~]# find . -name "*.cfg" | xargs rm -rf


练习示例:

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

find /var -user root -group mail

1.png

2、查找/var目录下不属于root、lp、gdm的所有文件

find /var -not  \( -user root -o lp -o gdm \)

2.png

3、查找/var目录下最近一周内其内容修改过,同时属主不为root,也不是postfix的文件

find /var -mtime -7 -not \( -user root -o -user postfix \)

3.png

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

find /  -atime -7  \( -nouser -o -nogroup \)

4.png

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

find /etc -size +1M -type f -ls

5.png

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

find ! -perm /222  -ls

6.png

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

find /root ! -perm -111  -ls

7.png

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

find /etc/init.d/  -perm -113

8.png

原创文章,作者:Groot,如若转载,请注明出处:http://www.178linux.com/36299

(0)
GrootGroot
上一篇 2016-08-18
下一篇 2016-08-18

相关推荐

  • Bashe Shell之数组及bash配置文件解析

    数组   数据结构,数据序列,保存了连续的多个数据,可以使用索引获取相关元素,相当于多个变量的集合   §数组名和索引 索引:编号从0开始,属于数值索引   注意:所以可支持使用自定义的格式,而不仅是数值格式,即关联索引,bash4.0版本之后开始支持,bash的数组支持稀疏格式(索引不连续)   §声明数组 &nbs…

    Linux干货 2016-08-24
  • 马哥教育网络班20期第1周课程练习

    答: 1、 ①控制器:是计算机的中枢神经,协调计算机各部分工作及内存与外设的访问等 ②运算器:运算器的功能是对数据进行各种算术运算和逻辑运算,即对数据进行加工处理。 ③储存器:存储器的功能是存储程序、数据和各种信号、命令等信息,并在需要时提供这些信息。 ④IO:输入设备是将数据或控制命令等信息输入到计算机。输出设备把机算机的各种数据符号及文字或各种控制信号等…

    Linux干货 2016-06-23
  • Net25-第13周作业

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

    Linux干货 2017-05-15
  • python 10第二周博客作业

    1.取磁盘利用率:cut -d命令 df|tr –s  ‘ ’   ‘%’ |cut –d “%” –f5正则表达式:df -h |grep “^/dev/sd” |grep -o “[[:digit:]]\+%”|grep -o “[[:digit:]]\+”2. paste 合并两个…

    Linux干货 2018-03-17
  • linux基础学习第七天-正则表达式及grep

    2016-08-04 授课内容: 各种文本工具来查看、分析、统计文本文件(more、less、cat、cut、sort、wc、uniq、head、tail、paste、diff) grep 正则表达式 扩展正则表达式 【】所有的文本查看、分析、统计等都是只是更改标准输出的显示方式,对原文件内容并没有更改 cat [OPTION]… [FILE]&…

    Linux干货 2016-08-07
  • 学习伊始宣言

    学习后的状态 以人事相宜为追求,优化职业资质 以胜任愉快为目标,保持职业体能 以创造绩效为主导,开发职业意识 以适应市场为基点,修养职业道德 学习宣言 如果不踏出第一步就永远也不可能到达目的地,让我们从此刻出发

    Linux干货 2016-11-28

评论列表(1条)

  • 马哥教育
    马哥教育 2016-08-19 14:40

    练习题第二天有问题,粘贴是不够用心哦。find命令需要多练习才能做到熟练运用。