1、locate文件查找命令:

locate:根据文件名查找文件

    非实时查找、模糊匹配、速度快,但是依赖于事先构建好的索引库,索引库可以通过系统自动实现(周期性任务),也可以通过命令手动实现,手动更新数据库(updatedb)

    模糊匹配体现在不只匹配路径中的基名,也匹配路径中的内容;

注意:locate构建索引库需要遍历整个根文件系统,极消耗资源。

    

locate命令格式:

  locate [OPTION]... PATTERN...

 [OPTION]  

    -b:只匹配路径中的基名;

    -c:统计有多少文件满足查找要求

    -r:基于正则表达式匹配查找内容 


2、find文件查找命令:

find:在指定的目录中查找文件

    实时查找工具,精确查找、速度慢,通过遍历指定起始路径下的文件系统层级结构,完成文件查找。

find命令格式:

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

或:find [option...] [查找起始路径] [查找条件] [处理动作]  

注意:查找起始路径要在查找条件之前,否则会报语法错误。


查找起始路径:指定具体搜索目标起始路径,不跟路径,默认为当前目录路径

查找条件:指定的查找标准,可以根据文件名、大小、类型、从属关系、权限等标准进行查找,不跟查找条件默认为找出指定路径下的所有文件。

处理动作:对符合查找条件的文件做出的操作,例如删除,默认为输出至标准输出;


2.1、查找条件:也叫表达式,它有选项和测试实现;测试结果通常为布尔型(true,false)

根据文件名查找:

    -name PATTERN:根据文件名查找; 

    -iname PATTERN:根据文件查找,忽略大小写;

    注意:此处的PATTERN,支持glob风格的通配符(*,?,[ ], [^ ])

  如:#find  /etc/ -name "passwd"

    -regex pattern :基于正则表达式模式查找文件,匹配整个路径,而非其名

根据文件从属关系查找:

    -user USERNAME:根据文件属主查找,查找属主为指定用户的所有文件

    -group GROUPNAME:根据文件属组查找,查找属组为指定组的所有文件

    -uid UID :根据文件uid查找,查找属主为指定UID的所有文件

    -gid GID:根据文件gid查找,查找属组为指定GID的所有文件

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

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

  如:#find /etc/ -user root

根据文件类型查找:

    -type TYPE:根据文件的类型查找

    f:普通文件

    d:目录文件

    l:符号链接文件

    b:块设备文件

    c:字符设备文件

    p:管道文件

    s:套接字文件

  如:find /etc -type f

根据组合测试查找:

    -a:与,同时满足各个条件;两个选项之间不加-a,默认为-a操作

    -o:或,满足条件中的任意一个即可;

    -not:非,用!表示也可

  如:

    #find /tmp -nouser -a -type f -ls

    #find /tmp -not -type f -ls

根据文件大小查找:

    -size [+|-]#unit :unit为单位,常用的为:K,M,G,默认为字节

         #unit:(#-1,#]

        +#unit:(#,+∞)

                            -#unit:[0,#-1]

根据文件时间戳查找

  以天为单位:

    -atime [+|-]# :#代表以天数为单位

    -mtime [+|-]# :#代表以天数为单位

     -ctime  [+|-]# :#代表以天数为单位

 以分钟为单位:

    -amin [+|-]# :#代表以分钟为单位

    -mmin [+|-]# :#代表以分钟为单位

    -cmin  [+|-]# :#代表以分钟为单位

+代表以外(-,-#-1];

-代表以内(-#,0);

没有+-代表那一刻时间(-#-1,-#]    

根据文件权限查找

    -perm [/|-] MODE

    mode:精确匹配权限

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

    -mode:任何一类用户(u、g、o)的权限中的每一位(r、w、x)同时符合条件即满足;

  如:

    #find /tmp -perm /222 ls  //表示查找tmp目录下文件的ugo三类用户任一用户具有“写”权限的文件;

    #find /tmp -perm -002 -ls //表示查找其他用户具有写权限的文件,0表示不关心权限设置

    #find /tmp -perm -222 -ls //表示查找三类用户同时具有写权限的文件

    #find /tmp -not -perm -222 -ls //表示查找至少有一类用户没有写权限的文件;

练习1:找出/tmp目录下为非root且文件名包括fstab字符串的文件

[root@localhost test]# find ./ -not -user root -a -name "*fstab*"


练习2:找出/tmp目录下文件名不包括fstab字符串的文件

[root@localhost test]# find ./ -not -name "*fstab*"



2.2、 处理动作    

    -print:输出至标准输出,默认动作

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

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

    -fls /PATH/TO/FILE :保存输出的详细信息至指定的文件中;

    -ok COMMAND {} \; :对查找到的每个文件执行由“COMMAND”表示的命令,每次操作有用户确认;其中{ }表示前面查找文件的占位符, 而\;为固定格式;

    -exec COMMAND {} \; :对查找到的每个文件执行由“COMMAND”表示的命令,每次操作不需要用户确认;其中{ }表示前面查找文件的占位符,而 \;为固定格式;   

  如:

[root@localhost test]# find ./ -not -name "*fstab*" -fls /tmp/aaa


[root@localhost test]# find ./ -not -name "*fstab*" -ok chown user:user {} \;


[root@localhost test]# find ./ -name "*fstab*" -exec chown basher: {} \;


[root@localhost test]# find ./ -perm -004 -exec mv {} {}.dan \;    //表示查找其他用户有读权限的文件,并对查找到的每个文件执行mv操作,即重命名每个文件在其后加上.dan


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

    find | xargs command