文件查找
locate,find
在文件系统上查找符合条件的文件;
实现工具:locate,find
locate:
依赖于实现构建好的索引库;
系统自动实现【定时任务】;
手动更新数据库(updatedb);
工作特性:
查找速度快;
模糊查找;
非实时查找。
使用yum安装locate : yum install mlocate
locate [OPTION]... PATTERN...
-b 仅仅匹配基名
-c count 统计出符合条件的个数
-r BRE基于基本正则表达式
注意:索引构建过程,即updatedb需要遍历整个根文件系统,机器消耗资源
find:
实时查找工具,通过便利指定其实路径下的文件系统层级结构完成文件查找;
工作特性:
查找速度略慢;
精确查找;
实时查找。
用法:
find [OPTIONS] [查找起始路径] [查找条件] [处理动作]
查找起始路径:指定具体搜索目标起始路径,默认为当前目录;
查找条件:指定的查找标准,可以根据文件名、大小、类型、从属关系、权限等标准进行,默认为找出指定路径下的所有文件。
处理动作:对符合查找条件的文件做出的操作,例如删除等操作,默认为输出至标准输出。可以使用ls等命令。
查找条件:
表达式:选项和测试组成
测试:【结果通常为布尔型(false,true)】
根据文件名查找:
-name "pattern"
-iname "pattern" 不区分大小写
支持glob风格的通配符 *,?,[],[^]
-regex pattern 基于正则表达式模式查找文件,匹配的是整个路径,而不是文件名【没弄明白,一般不用】
根据文件的从属关系查找
-user username
-group groupname
-uid uid 查找属主指定的UID的所有文件
-gid GID 查找属组指定的GID的所有文件
-nouser 查找没有属主的文件
-nogroup 查找没有属组的文件
没有属主和属组的文件是很危险的,需要定期查找系统中没有属主和属组的文件。
根据文件的类型查找:
-type TYPE:
f:普通文件
d:目录文件
l:符号链接文件
b:块设备文件
c:字符设备文件
p:管道文件
s:套接字文件
组合测试:
与:-a 默认是与组合逻辑,两个条件都满足才输出
或:-o 如果一个条件符合,则输出 shi
非:-not或者-!
例如:find /tmp -not -user "juha" -ls 显示tmp目录下属主不是juha的所有文件
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
注意,使用组合时,如需使用括号,则需使用转义符即\( 和\)
根据文件的大小查找:
-size [+|-] #unit
常用单位:k,M,G
#unit:(#-1,#] 大于这个值减一,但是小于等于这个值
-#unit:[0,#-1] 小于等于这个值减一
+#unit:(#,∞) 大于这个值
根据时间戳查找:
a access,c change,m modify
以天为单位:
-atime [+|-]#
#:[#,#-1]过去#天一天之内
-#:(#,0] 距离现在#天之内
+#(-∞,#-1] #天之前
-mtime
-ctime
以分钟为单位
-amin
-mtime
-ctime
根据权限查找:
-perm [/|-] mode
mode: 精确权限匹配 例如777
/ mode:任何一类用用户(u,g,0)的任何一位(rwx)符合条件即满足 ,9位权限或关系
例如 find /tmp /111 代表查找至少一个组有执行权限的,find /tmp /001查找其他组中有执行权限的文件
-mode:每一类用户(u,g,o)中的每一个位同时符合条件即可,9位权限是与关系
例如,find /tmp -111 代表查找三类组都应该有执行权限,find /tmp -011查找其他组且属组中中有执行权限的文件
处理 动作(对最后一个输出的结果生效,如果是或,注意使用括号):
-print:输出至标准输出,默认的动作;
-ls:类似于对查找到的文件执行ls -l命令,输出文件的详细信息;
-delete 删除查找到的文件
-fls /path/to/file 把查找到的所有文件的长格式信息保存至指定文件中。危险,不建议做。
-ok COMMAND {} \; 对查找到的每个文件执行COMMAND命令操作,{}的作用是引用查找到的文件名 的,但是改了多少个文件就要手动确认多少次。
例如:find ./ -nogroup -ok chown root:root {}\; 表示对查找到的没有属组的文件执行改变属主和属组为root。
-exec COMMAND {}\;对查找到的每个文件执行COMMAND命令操作,无需确认操作。
例如:find ./ -perm /002 -exec mv {} {}.danger \;表示把当前目录下的其他组有写权限的文件更名为原文件名后加.danger。
注意:find传递查找 的 文件路径至后面的命令时,是先查找出所有符合条件的文件路径,并一次性传递给后面的命令;但是有些命令不能接受过长的参数,此时命令执行会失败,可通过另一种方式避免此问题:
find | xargs COMMAND
网友评论