linux中locate,find命令都是在文件系统中查找符合条件的文件,但是locate是利用数据库来搜寻数据,所以速度相对比较快。
locate依赖于事先构建好的索引库,每天系统在空闲时间都会通过周期性任务自动完成索引库的更新,手动更新索引库就需要执行命令updatedb,也正是因为依赖于数据库,造成locate查询出来的结果可能会跟执行查询命令时的实际情况有出入,并且其为模糊查找。
locate命令格式:
locate [OPTION]... [PATTERN]...
常用选项:
-b,--basename:只匹配路径中的基名;
-c,--count:统计出共有多少个符合条件的文件;
-r, --regexp REGEXP:查询时用基本的正则表达式;
-i, --ignore-case:忽略大小写查询;
注意:索引构建过程需要遍历整个根文件系统,及其消耗资源。
find是实时查找工具,通过遍历指定起始路径下文件系统层级结构完成文件查找,其查找速度比较慢,但为精确查找。
find用法:
格式:find [OPTIONS] [查找起始路径] [查找条件] [处理动作]
find [PATH] [option] [action]
查找起始路径:指定具体搜索目标起始路径,默认为当前目录;
查找条件:指定的查找标准,可以根据文件名,大小,类型,从属关系,权限等标准进行,默认为找出指定路径下的所有文件;
处理动作:对符合条件的文件做出操作,如删除,重命名等
以下对查找条件做出略微详细的说明:
根据文件名查找:
-name pattern
-iname pattern:同-name,但是不区分大小写;
此处的pattern支持glob风格的通配符,如*,?,[],[^]等;
-regex pattern:基于正则表达式查找,匹配到的是整个路径,而非文件名;
根据文件从属关系查找:
-user uname:查找属主为指定用户的文件;
-group gname:查找属组为指定组的文件;
-uid n:查找属主为指定UID的文件;
-gid n:查找属组为指定GID的文件;
-nouser:查找没有属主的文件;
-nogroup:查找没有属组的文件;
根据文件类型查找:
-type TYPE:
f:普通文件;
d:目录文件;
l:符号链接文件;
b:块设备文件;
c:字符设备文件;
p:管道文件;
s:套接字文件
根据文件大小查找:
-size [+|-]#UNIT ;其中#表示数字,UNIT为单位
常用的单位为:k,M,G
范围举例:
3M:(2,3]
-3M:[0,2]
+3M:(3,oo) ;oo表示无穷大
根据时间戳查找:
以“天”为单位:
-atime [+|-]#
-atime # :#为数字,意思为在#天之前的’一天之内‘访问过文件;[#,#-1)
-atime +# :列出在#天之前(不包含#天本身)被访问过的文件;(oo,#+1]
-atime -#:列出在#天之内(含#本身)被访问过的文件;(#,0]
如下图:#=4时的情况
-mtime与-ctime的用法与-atime相同,可以参考其用法;
以“分钟”为单位:
-amin:
-mmin:
-cmin:
这三个条件的用法与上边的-atime用法相同,可以参考其用法;
-newer file:file为一个已经存在的文件,此条件为列出比file还要新的文件名;
根据权限查找:
-perm [/|-]mode
mode:精确权限匹配;
/mode:任何一类用户(u,g,o)的权限中的任何一位(r,w,x)符合条件即满足;
9位权限之间存在“或”关系;
-mode:每一类用户(u,g,o)的权限中的每一位(r,w,x)同时符合条件即满足;
9位权限之间存在“与”关系;
注意:这些条件之间可以组合起来:
与:-a ,默认组合逻辑
或:-o
非:-not,!
处理动作:
-print:输出至标准输出,默认动作;
-ls:类似于对查找到的文件执行“ls -l”命令,输出文件的详细信息;
-delete:删除查找到的文件;
-fls /PATH/TO/SOMEFILE:把查找到的所有文件的长格式信息保存至指定文件中;
-ok COMMAND {} \; :对查找到的每个文件执行由COMMAND表示的命令,每次操作都由用户确认;
-exec COMMAND {} \; :对查找到的每个文件执行由COMMAND表示的命令,但用户不用确认;
{}表示对find命令执行结果的引用 \;为固定格式
注意:find传递查找到的文件路径至后边的命令时,是先查找出所有符合条件的文件路径,并一次性传递给后边的命令,但是有些命令不能接受过长的参数,此时命令执行会失败,而另外一种方式可以规避此问题:
find | xargs COMMAND
xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样.这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去.在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;而使用xargs命令则只有一个进程.另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定