且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Linux文本处理---文件属性查找

更新时间:2022-08-18 19:32:11

  • 文件查找

    所谓的文件查找时根据文件的各种属性在特定的路径下找到对应文件的过程。


一、文件查找的方式

  • 实时查找:遍历所有文件进行条件匹配。查找精确,但是速度慢。

    这种查找通过find命令来实现。

  • 非实时查找:根据索引进行查找。查找速度快,但是查找不精确。

    这种查找locate命令,它只依赖于索引查找的,索引的创建时在系统空闲的时候由系统自动进行的。手动更新数据库的命令式upadtedb。


二、实时查找

    通过find命令来实现。find是根据查找条件,在查找路径中查找到对应的文件,根据处理动作做出相应的操作。

    Usage: find [options]... [查找路径] [查找条件] [处理动作]

    查找路径:默认是当前路径

    查找条件:默认是指定路径下的所有文件

    处理动作:默认的处理动作时显示到屏幕上

查找条件类型:


查找条件类型 具体意义 示例

-name

-iname

支持通配符

-name 文件名

-iname 文件名(不区分大小写)

查找当前路径下s开头的文件名

find ./ -name "s*"

查找当前路径下s|S开头的文件名

find ./ -iname "s*"

-uid -user -nouser

-gid -group -nogroup

-uid 根据文件属主的UID查找

-user 根据文件属主名查找

-nouser 没有属主的文件

查找当前路径下文件属主uid为500文件

find ./ -uid 500 

查找当前路径下文件没有属主的文件

find ./ -nouser 

-type 

-type 根据文件类型查找

文件类型:f,d,l,b,c,s,p

查找当前路径下是目录的文件

find ./ -type d 

-size

-size 根据文件大小查找


-size 12M 精确查找(11-12M之间都满足)

-size +12M 大于12M的文件

-size -12M 小于12M的文件

查找当前路径下文件名s开头的并且大于100G的文件

find ./ -size +100G -a -name 's*'

-atime -mtime -ctime

-amin -mmin -cmin

-atime 根据访问时间查找单位是天,-amin的单位是分

-mtime -mmin 文件内容修改时间

-ctime -cmin 文件元数据信息修改时间


-atime 2 修改时间是2天之前(2-3天)

-atime -2 修改时间是2天之内

-atime +2 修改时间是3天之外(>3天)

查找/etc/目录下最近一周内其内容修改过的

find /etc/ -mtime -7


查找/etc/目录下最近一周内其内容没有修改过的(也就是7天之前修改过的)

find /etc/ -mtime +7

-perm

-perm 根据文件权限查找

-prem 644 文件权限就是644的


-prem +222 只要有任意一类用户可写权限即可(222对应的权限是-w--w--w-,查找文件的权限中,只要有一个对应位有w权限即可)


-prem -222  每一用户至少有可写权限,属主,属组,其他每个都至少有可写权限

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

find /etc/ -not -perm +222


查找/etc/目录所有用户都可写权限的文件

find /etc/ -perm -222

    注意:在使用查找条件是可使用组合条件查询:-a(&&),-o(||),-not(!)。


处理动作:


处理动作 具体意义 示例
-print 默认处理动作,打印 find /etc/ -mtime -7 -print
-exec

-exec COMMAND {} \;

一次性查找符合条件的所有文件,并一同传递给CMOMANDD作为参数

find /etc/ -mtime -7 -exec rm -f {} \;
-ok

-ok COMMAND {} \;

同exec一样,只是在执行命令的时候会有所提示

find /etc/ -name 'i..ue' -ok rm -f {} \;

    在使用exex后ok参数的时候,有些命令接受的参数有长度有限,运行过程中出现“参数列表过长”的类似信息。此时需要用另一个命令xargs。通常的用法是 find [option] [查找路径] [查找条件] | xargs COMMAND。


    执行过程是:find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。   

    在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。


三、非实时查找

    通过locate命令来查找,是一种模糊匹配。

    Usage: locate [option]... [PATTERN](通配符)

    常用参数:

        -d 指定数据库(索引)的路径,默认是/var/lib/mlocate/mlocate.db

        -b '\NAME'精确匹配

1
2
3
4
5
6
7
[root@server ~]# locate -b '\root' 
/root
/etc/selinux/targeted/contexts/users/root
/usr/src/kernels/2.6.32-358.el6.x86_64/include/config/usb/ehci/root
/var/spool/cron/root
/var/spool/mail/root
###locate 'root' 如果是这样的话,查询的是 *root* 这种模式

    我们一般都是使用精确查找,所以这里只对locate做大致了解。

四、练习

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#1、查找/var/目录属主为centos且属组为mail的所有文件;
 find /var -user centos -a -group mail
 
#2、查找/usr目录下不属于root、bin或hadoop的所用文件;
find /usr -not -user root -a -not -user bin -a -not -user hadoop
#这里使用小括号时需要转义,并且小括号前后都有空格
find /usr -not \( -user root -o -user bin -o -user hadoop \)
 
#3、查找/etc/目录下最近一周内其内容修改过的,且不属于root且不属于hadoop的文件;
find /etc -mtime -7 -a -not \( -user root -o -user hadoop \)
 
#4、查找当前系统上没有属主或属组,且最近1个月内曾被访问过的文件;
find / \( -nouser -o -nogroup \) -a -atime -30
 
#5、查找/etc/目录下大于1M且类型为普通文件的所有文件;
find /etc -size +1M -type f
 
#6、查找/etc/目录所有用户都没有写权限的文件;
find /etc/ -not -perm +222
 
#7、查找/etc/目录下至少有一类用户没有写权限;
find /etc/ -not -perm -222
 
#8、查找/etc/init.d/目录下,所有用户都有执行权限且其它用户有写权限的文件;
find /etc/init.d/ -perm -113










本文转自 羊木狼 51CTO博客,原文链接:http://blog.51cto.com/guoting/1437432,如需转载请自行联系原作者