zoukankan      html  css  js  c++  java
  • 文件查找:locate、find

    文件查找:在文件系统上查找符合条件的文件;

    locate, find

    非实时查找(数据库查找):locate  //不是遍历系统文件,把当前系统目录下的所有文件抽取出来制作成一个索引(或者叫数据库),locate就是基于索引进行的查找;

    实时查找:find

    locate:依赖于事先构建的索引;索引的构建是在系统较为空闲时自动进行(周期性任务);

                  手动更新数据库(updatedb);

           索引构建过程需要遍历整个根文件系统,极消耗资源;

     

    工作特点:

                         查找速度快;

                         模糊查找;

                         非实时查找;

    语法

    locate KEYWORD

    # locate passwd

    find:

    实时查找工具,通过遍历指定路径下的文件系统完成文件查找;

     

    工作特点:

                  查找速度略慢;

                  精确查找;

                  实时查找;

     

    语法:

    find [OPTION]... [查找路径] [查找条件] [处理动作]

    查找路径:指定具体目标路径;

       默认为当前目录;

    查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;

       默认为找出指定路径下的所有文件;

    处理动作:对符合条件的文件做什么操作;

       默认输出至屏幕;

    大多数用到的是查找路径、查找条件、处理动作

    查找条件:

    根据文件名查找:

    -name "文件名称"(严格区分大小写):支持使用glob

    *, ?, [], [^]

    示例:

    # find /etc/ -name passwd

    # find /etc/ -name "passwd*"

    -iname "文件名称":不区分字母大小写

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

     

    根据属主、属组查找:

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

    # find /tmp -user root -ls  //查找tmp目录下属主为user的文件,并用-ls长格式显示

    -ls:是查找到文件,对文件执行的动作 ,相当于#ls -l

    -group GRPNAME: 查找属组为指定组的文件;

    # find /tmp -group user1 -ls

    -uid UserID:查找属主为指定的UID号的文件;

    # find /home -uid 501 -ls

    -gid GroupID:查找属组为指定的GID号的文件;

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

    当一个用户被删除后,这个用户之前创建的文件的属主和属组就为这个用户的UID和GID了。

    # find /tmp -nouser -ls

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

    # find /tmp -nogroup -ls

     

    根据文件类型查找:

     -type TYPE:

    f: 普通文件

    d: 目录文件

    #find /tmp -type d     

    #find /tmp -type d -ls

    l: 符号链接文件

    s:套接字文件

    #find /tmp -type s     

    b: 块设备文件

    c: 字符设备文件

    p: 管道文件

    组合条件:

    与:-a

    或:-o

    非:-not, !

     

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

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

     

    # find /tmp -nouser -o -nogroup  //没有属主或没有属组的文件

    # find /tmp ( -nouser -o -nogroup ) -ls  //这里如果想要用-ls显示,需要加括号,并用进行转义,如果不加括号,-ls只对-o后面的条件进行显示。

    找出/tmp目录下,属主不是root,且文件名不是fstab的文件;

    #ll /tmp

    # find /tmp ( -not -name fstab -a -not -group root ) -ls   或

    # find /tmp -not ( -name 'fstab' -o -group 'root' ) -ls

    根据文件大小来查找:

     -size [+|-]#UNIT     #:表数字,UNIT:表单位

    常用单位UNIT:k, M, G

    #UNIT: (#-1, #]  //表示#大于#-1,小于等于#,因为这里是半开半闭的空间

    # find /var -size 3k -exec ls -lh {} ;  //大于2K小于等于3K

    -#UNIT:[0,#-1]  比如-3k:表示大于等于0开始,小于等于3-1结束,不包括2.#的,因为2.#是属于3k的空间

    # find /var -size -3k -exec ls -lh {} ;  //从0K到3k-1K的空间

    +#UNIT:(#,oo)  :开区间,大于所给的数字#一直到所有

    # find /var -size +3k -exec ls -lh {} ;   //3k以上的都包括

    根据时间戳:

     以“天”为单位;  

    -atime:访问时间    文件的 Access time,atime 是在读取文件或者执行文件时更改的。
    -mtime: 修改时间    文件的 Modified time,mtime 是在写入文件时随文件内容的更改而更改的。
    -ctime: 改变时间     文件的 Create time,ctime 是在写入文件、更改所有者、权限或链接设置时随 Inode的内容更改而更改的。 

     

    ls(1) 命令可用来列出文件的 atime、ctime 和 mtime。
    ls -lc filename       列出文件的ctime
    ls -lu filename       列出文件的atime
    ls -l filename        列出文件的mtime 

     

    -atime [+|-]#,    //-#:表示多少天以内被访问,+#:表示多少天以前被访问   #:表示正好多少天被访问

    #: [#,#+1)    //大于等于#,小于#+1

    # find /etc -mtime 3 -ls  //大于等于3天,小于3+1天,即3≤#<4

    +#: [#+1,oo]  //大于等于#+1天,到无穷大    

    -#: [0,#)   //假如#=3,则3天以内被访问过的,不包括3天  0≤#<3

    -mtime

    # find /etc -mtime 3 -ls   //正好3天被访问过,满3天,不到4天

    -ctime

     

    #touch a.sh b.sh c.sh

    # touch -a -t 201806180707 a.sh   //-a是指定访问时间,修改a.sh的访问时间大于现在时间3天小于4天

    # touch -a -t 201806120707 b.sh  //修改b.sh的访问时间大于现在时间3天

    # touch -a -t 201806200707 c.sh //修改a.sh的访问时间小于现在时间3天

    # find test/ -atime 3  //访问时间等于3天的

    # find test/ -atime +3  //访问时间大于3天的

    # find test/ -atime -3  //访问时间小于3天的

     

    以“分钟”为单位:

    -amin

    -mmin

    -cmin

    根据权限查找:  在centos7中已经把+换成了/

     -perm [/|-]MODE       +:表示或关系,即三类用户满足一个即可,-:表示与关系,即三类用户各自指定条件必须同时满足

    MODE: 精确权限匹配

    # find /etc -perm 600 -ls  //精确匹配权限为600的文件

    +MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可;(任何一类中只要有一位匹配即可)

    # find /etc -perm +222 -ls   //属主、属组或其他有一类有些权限即可

    #find /etc -perm +600 -ls   //属主是6,表示读写,因此要看属主能读或者能写满足其一即可,属组和其他权限为0,表示不做考虑,不是查找标准,只关心属主

    # find /etc -perm -060 -ls  //表示属组能读或者能写都符合,因为6表示属组为wr-,所以属组中w或r都满足

    -MODE:每一类对象都必须同时拥有为其指定的权限标准;

    指定-666,那么-766是符合的,但是-760是不符合的

    # find /etc -perm -003 -ls  //0表示不考虑,所以属主属组不关心,其他权限必须包含写权限和执行权限

     

    处理动作:即查找完成后对查找到的对象做什么执行动作

     -print:默认的处理动作,显示至屏幕;

    -ls:类似于对查找到的文件执行“ls -l”命令;

    -delete:删除查找到的文件;

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

    -ok COMMAND {} ; 对查找到的每个文件执行由COMMAND指定的命令;{} ;  :固定格式

    对于每个文件执行命令之前,都会交互式要求用户确认;

    # find /tmp -nogroup

    # find /tmp -nogroup -ok chown :root {} ;   //查找没有属组的并更改

    -exec COMMAND {} ; 对查找到的每个文件执行由COMMAND指定的命令; ,不要求用户确认

    # find /tmp -nouser -exec chown root {} ;   查找/tmp目录下没有属主的文件,并改为root属主

    {}: 用于引用查找到的文件名称自身;

    #find test -cmin -5  //小于5分钟,这里因为test目录刚刚修改了

    # find /tmp -cmin -5 -exec mv {} {}.new ;    //查找tmp目录下改变时间小于5分钟的文件,并重新命名,即使多个文件也是两个{}表示即可

    注意:find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命令;

    有些命令不能接受过多参数,此时命令执行可能会失败;另一种方式可规避此问题:

    即:find | xargs COMMAND 

     练习题:  -a是可以省略的

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

    # find /var -user root -group mail -ls

    2、查找/usr目录下不属于root、bin或hadoop的所有文件或目录;

    # find /var -not -user root -a -not -user bin -a -not -user hadoop

    # find /var -not  ( -user root -o -user bin -o -user hadoop )

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

    # find /etc -mtime -7 -a -not -user root -a -not -user hadoop

    # find /etc/ -mtime -7 -a -not ( -user root -o -user hadoop )

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

    # find / -nouser -a -nogroup -a -mtime -7 -ls    //-a是可以省略的

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

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

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

    # find /etc -not -perm /222

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

    # find /etc -not -perm -111 -ls

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

    # find /etc/init.d -perm +111 -a -perm +002 -ls

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

  • 相关阅读:
    利用Js/Jquery实现div的隐藏与显示(注意释放与不释放空间)
    关于js 中 alert 事件弹框提示,title显示页面url网址问题
    前端获取Ajax请求获取数据,无法赋值给全局变量
    JS根据条件正则截取相应字符,以及常用截取函数
    Git切换分支命令
    CodeIgniter (CI)框架中的数据库查询汇总
    解决Failed to load resource: the server responded with a status of 413 (Request Entity Too Large)错误//解决 413 Request Entity Too Large
    Linux: cp 复制文件(文件夹)
    LeeCode(No4
    RSS简介
  • 原文地址:https://www.cnblogs.com/hanshanxiaoheshang/p/9203820.html
Copyright © 2011-2022 走看看