文件查找命令之locate、find简析

文件查找命令之locate、find简析

   在工作中经常会在文件系统上查找符合条件的文件,今天学习了文件查找命令,在此简析locate和find两个文件查找工具。

一、杂项知识整理

1、find的选项-user的实质是通过UID查找,如果两个用户的UID相同,其会显示两个用户的所有符合条件的文件。

2、查找时-name "*.txt"中的文件名必须加双引号。

3、find查找的时候,如果对象是个目录的软链接,需要加/,如果不加/则默认把目录看做一个文件进行查找,加了/之后会通过链接进入真是目录中进行文件的查找,例如:

[root@localhost etc]# find /etc/rc3.d -perm /200
/etc/rc3.d
[root@localhost etc]# find /etc/rc3.d/ -perm /200
/etc/rc3.d/
/etc/rc3.d/K50netconsole
/etc/rc3.d/S10network

4、按时间和大小查找的图解:

按大小查找.png

按时间查找.png

二、命令详解及事例

1、locate命令:在文件系统上查找符合条件的文件:

    依赖于实现构建好的索引库,其索引库是系统自动建立并周期性自动更新的,手动更新数据库用updatedb。

    工作特性:查找速度快,模糊查找,非实时查找,更新数据库索引需要遍历整个根文件系统,极其消耗系统资源。

    -b 只查找路径中的基名

    -r 扩展正则表达式

    -c 统计出共多少个符合条件,-bc 

    -w 路径名

    -i 忽略字符大小写

    -n # 只列举前#个匹配项目

[root@localhost ~]# locate -c *.sh
2
[root@localhost ~]# locate *.sh
/root/a.sh
/root/a.sh.bak
[root@localhost ~]# updatedb

2、find命令:实时查找工具,通过遍历指定起始路径下文件系统层级结构完成文件查找。

工作特性:查找速度略慢,精确查找,实时查找

用法:find [查找起始路径] [查找条件] [执行动作]

    起始路径:默认当前目录

    条件:指定的查找标准,大小类型从属关系等

    动作:对符合条件的文件作出的操作,例如删除等,默认为输出至标准输出,-print

    -name “PATTERN”

    -iname "PATTERN"

        支持glob风格的通配符;

    -regex PATTERN

        基于正则表达式模式查找文件,匹配的是整个路径,而非其名

    -user NAME 查找属主指定用户的所有文件

    -group NAME 查找属组指定用户的所有文件

    -uid NUM 指定UID的所有文件

    -gid NUM

    -nouser 查找没有属主的用户的所有文件

    -nogroup 查找没有属组的用户的所有文件

    -type TYPE

        f d l b c字符设备文件 p s 

   组合逻辑:

    -a 与

    -o 或

    -not或!非

   按文件大小查找

    -size NUM

        -NUM

        +NUM

   按时间查找:以天为单位:

    -atime 访问时间

        # -# +#

    -mtime -ctime

    以分钟为单位

        -amin 访问时间 -mmin 修改时间 -cmin改变时间

   根据权限匹配

    -perm /mode 任何一类用户的权限中的任何一位符合条件即满足

        -mode 每一类用户的权限中的每一位同时符合条件即满足

        mode 精确权限匹配

  处理动作:

    -print 输出标准输出,默认的动作

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

    -delete 删除查找到的文件

    -fls /PATH/FILE 保存至指定路径文件中

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

    -exec COMMAND {}\; 对查找到的每个执行由COMMAND表示的命令,直接执行不需要确认。

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

    xargs命令:xargs是一条unix和类unix操作系统的常用命令,他的作用是将参数列表转换成小块分段传递给其他命令,以避免参数该列表过长的问题。

find | xargs COMMAND

用xargs实现多参数的命令处理:xargs -i{} COMMAND

[root@localhost tmp]# find /testdir/shelltest/  -name m* | xargs -i{} cp {} ./
[root@localhost tmp]# ls
mysh10.sh  mysh13.sh  mysh16.sh  mysh19.sh  mysh21.sh  mysh4.sh  mysh7.sh

避开某个目录:-prune,例如:

find /etc -path ‘/etc/sane.d’ (-a) -prune -o -name "*.conf

    -prune就像一个判断语 句,当发现-prune前面的表达式math时,执行到-prune之后就会输出一个1结果,如果shell的话,可以使用echo $?来看结果,如果-prune后面跟的是-o选项,用c语言的语法来讲的话就是1 || -print,所以明显可以看到当-prune前面的 表达式成立的话,就不会执行-o后面的内容了,如果不成立,即0 || -print,那么将打印输出,另外需要注意的是-path路径不能加入 结尾的/,比如路径/vobs/gliethttp/signature,不能写成/vobs/gliethttp/signature/如果find .那么后面-path的必须使用相对路径./gliethttp除 find中.之外,其他所有查找,比如find tmp或者find /vobs等,-path都必须使用绝对路径

[root@localhost test]# ls
ch.sh          mysh13.sh.bak  mysh17.sh.bak  mysh20.sh.bak     mysh4.sh.bak  mysh8.sh.bak
mysh10.sh.bak  mysh14.sh.bak  mysh18.sh.bak  mysh21.sh.bak     mysh5.sh.bak  mysh9.sh.bak
[root@localhost test]# cd ..
[root@localhost tmp]# ls
mysh10.sh  mysh13.sh  mysh16.sh  mysh19.sh  mysh21.sh  mysh4.sh  mysh7.sh  test
mysh11.sh  mysh14.sh  mysh17.sh  mysh1.sh   mysh2.sh   mysh5.sh  mysh8.sh
[root@localhost tmp]# find ./ -path ./test -prune -o -name "my*"
./mysh7.sh
./mysh14.sh
./mysh18.sh
./mysh20.sh

3、德摩根定律:

德摩根定律0.png

德摩根定律1.png

德摩根定律2.png

德摩根定律3.png

德摩根定律4.png

德摩根定律5.png

三、课后练习

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

find /var -user root -group mail

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

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

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

find /var/ -mtime -7 -not -user root -not -user postfix -ls

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

find / -nouser -nogroup -atime -7

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

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

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

[root@localhost tmp]# find /etc/ -not -perm /222 -ls
50740639  196 -r--r--r--   1 root     root       198453 7月 19 04:57 /etc/pki/ca-trust/extracted/java/cace
rts464249  352 -r--r--r--   1 root     root       359773 7月 19 04:57 /etc/pki/ca-trust/extracted/openssl/ca-
bundle.trust.crt17127677  264 -r--r--r--   1 root     root       266702 7月 19 04:57 /etc/pki/ca-trust/extracted/pem/tls-c
a-bundle.pem

7、查找/etc目录下至少有一类用户没有执行权限的文件;至少一类用户没有,包含全没有,或者任意一类用户或者两类用户有,全都有取反

[root@localhost init.d]# find /etc/init.d/  -not -perm -111 -ls
34178284    4 -rw-r--r--   1 root     root         1160 11月 20  2015 /etc/init.d/README
34220229   16 -rw-r--r--   1 root     root        13948 9月 16  2015 /etc/init.d/functions

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

[root@localhost init.d]# find /etc/init.d/ -perm -113
/etc/init.d/

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

(0)
SilencePavilionSilencePavilion
上一篇 2016-08-15 09:25
下一篇 2016-08-15 09:25

相关推荐

  • LVM——如何让你的磁盘空间可大可小

    逻辑卷管理器(LVM) 允许对卷进行方便操作的抽象层,包括重新设定文件系统的大小 允许在多个物理设备间重新组织文件系统          将设备指定为物理卷          用一个或者多个物理卷来创…

    Linux干货 2016-08-29
  • N25期第二周作业

    1.Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示 ls 列出文件和目录命令 -a:显示所有档案及目录 -A:显示除隐藏文件”.”和”..”以外的所有文件 -C:多列显示结果,默认选项 -l:单列显示结果,以长格式显示目录下的内容列表 -F:在每个输出项后追加文件的类型标识符 &#822…

    Linux干货 2016-12-11
  • Java输入输出流

    1.什么是IO       Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列。Java的I/O流提供了读写数据的标准方法。任何Java中表示数据源的对象都会提供以数据流的方式读写它的数据的方法。 &nb…

    Linux干货 2015-04-10
  • OSI参考模型与TCP/IP参考模型的比较

    OSI参考模型与TCP/IP参考模型的比较 OSI参考模型 OSI参考模型是ISO的建议,它是为了使各层上的协议国际标准化而发展起来的。OSI参考模型全称是开放系统互连参考模型(Open System Interconnection Reference Model)。这一参考模型共分为七层:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。 物理层…

    Linux干货 2017-05-07
  • 磁盘管理之LVM

    1、什么是LVM     LVM(Logical Volume Manager)逻辑卷管理,是linux环境下将一种将一个或多个硬盘的分区在逻辑上集合来呈现给上层应用,对磁盘实现动态管理的机制。相对于普通的磁盘分区有很大的灵活性,使用LVM在一定程度上就可以解决普通磁盘分区带来的问题。 2、专业术语     &nbsp…

    Linux干货 2016-09-02
  • 学习笔记–文本处理工具

    Linux下有很多文本处理工具,本文将介绍几款比较常用的文本处理工具,比如对文本查看的工具:cat和less,文本截取工具:head和tail,按列抽取文本工具:cut,按关键字查询文本工具:grep,下面将具体介绍各种工具的使用。 1、文本查看命令cat 用法: cat [OPTION]… [FILE]… cat命令一次性…

    Linux干货 2016-08-07