文件查找:
在文件系统上查找符合条件的文件
文件查找命令:
locate:非实时查找( 数据库查找)
find:实时查找
locate:
查询系统上预建的文件索引数据库
/var/lib/mlocate/mlocate.db
依赖于事先构建的索引
索引的构建是在系统较为空闲时自动进行( 周期性 任务),管理员 手动更新数据库(updatedb)
索引构建过程需要遍历整个根文件系统,极消耗资源
工作特点:
• 查找速度快
• 模糊查找
• 非实时查找
• 搜索的是文件的全路径,不仅仅是文件名
• 可能只搜索用户具备读取和执行权限的目录
locate 命令
locate KEYWORD
-i:执行不区分大小写的搜索
-n N:只列举前N 个匹配项目
-b:只匹配路径中的基名
-c:只显示统计多少个符合条件的路径
-r:能基于基本正则表达式来编写命令
locate foo
• 搜索名称或路径中带有“foo ”的文件
locate -r ‘.foo$’
• 使用Regex 来搜索以“.foo ”结尾的文件
find
实时查找工具,通过遍历指定路径完成文件查找;
工作特点:
• 查找速度略慢
• 精确查找
• 实时查找
• 可能只搜索用户具备读取和执行权限的目录
用法:
find [OPTION]... [ 查找路径] [ 查找条件] [ 处理动作]
查找路径:
指定具体目标路径,默认为当前目录
查找条件:
指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件
处理动作:
对符合条件的文件做操作,默认输出至屏幕
查找条件
表达式:选项和测试
根据文件名和inode 查找:
-name " 文件名称":支持使用glob *, ?, [], [^]
-iname " 文件名称":不区分字母大小写
-inum n:按inode 号查找
-samefile name:相同inode 号的文件
-links n:链接数为n 的文件
-regex "PATTERN":以PATTERN(正则表达式)匹配整个文件路径字符串,而不仅仅是文件名称ID
根据属主、属组查找:
-user USERNAME:查找属主为指定用户(UID) 的文件
-group GRPNAME:查找属组为指定组(GID) 的文件
-uid UserID:查找属主为指定的UID 号的文件
-gid GroupID:查找属组为指定的GID 号的文件
-nouser:查找没有属主的文件
-nogroup:查找没有属组的文件
根据文件类型查找:
-type TYPE
f:普通文件
d:目录文件
l:符号链接文件
s:套接字文件
b:块设备文件
c:字符设备文件
p:管道文件
组合条件:
与:-a
或:-o
非:-not !
德· 摩根 定律:
(非 A) 或 (非 B) = 非(A 且 B)
(非 A) 且 (非 B) = 非(A 或 B)
示例:
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
find 示例
find -name snow.png
搜索名为snow.png 的文件
find -iname A.png
不分大小写查找名为A.png 、a.png、 A.PNG 等等的文件
find / -name “.txt”
查找根目录下后缀名为txt的文件
find /var –name "log*"
查找var目录下包含log的文件
find -user test -group test
搜索被用户test 以及组群test所拥有的文件
其它示例:
find -user test -not -group test
find -user test -o -user test
find -not ( -user test -o -user test )
find / -user test -o -uid 500
找出/tmp 目录下,属主不是root ,且 文件名 不以f 开头的 文件
find /tmp ( -not -user root -a -not -name 'f' ) -ls
find /tmp -not ( -user root -o -name 'f' ) –ls
排除目录
示例:查找/etc/ 下,除/etc/sane.d 目录的其它所有.conf 后缀的文件
find /etc -path ‘/etc/sane.d’ -a -prune -o -name “*.conf” -print
根据文件大小来查找:
-size [+,-]#unit
常用单位:k, M, G
如:6k 表示(5k,6k]
-#unit :[0到#-1]
如:-6k 表示[0到5k]
+#unit :(#和大于#)
如:+6k 表示(6k或大于6k )
根据时间戳
以天为单位(time):
-atime [+|-]# 访问时间
+#:表示(#+1)天之外被访问
-#:表示#天内被访问过的
#:表示小于(#+1)大于或者#天的时间段被访问过
-ctime:改变时间
-mtime:修改时间
以分钟为单位(min)
-amin
-mmin
-cmin
根据权限查找:
-perm [+|-]MODE
MODE:精确匹配
+MODE:任何一类用户的任何一位权限匹配即可,常用于查找某类用用户的某特定权限是否存在
-MODE:每类用户的指定要检查的权限位都匹配
示例:
find -perm 755,会匹配权限模式恰好是755 的文件
只要当任意人有写权限时,find -perm +222 就会匹配
只有当每个人都有写权限时,find -perm -222 才会匹配
只有当其它人(other )有写权限时,find -perm -002才会匹配
处理动作:
-print:默认,打印在标准输出上
-ls:以长格式输出各文件信息,类似于ls -l
-delete:删除查找到的文件
-fls file:查找到的所有文件的长格式信息保存至指定文件中
-exec COMMAND {} ;:对查找到的文件指定的命令
-ok COMMAND {} ;:交互式,对查找到的每个文件执行由COMMAND 指定的命令
find |xargs COMMAND: find把查找到的所有文件一次性地传递给-exec执行
{}:用于引用查找到的文件名称自身
参数代换:xargs
用于产生某个命令的参数 xargs 入可以读入stdin的数据,并且以空格符或回车符将stdin的数据分隔成为arguments
注意:文件名或者是其他意义的名词内含有空格符的情况
有些命令不能接受过多参数 ,命令执行可能会失败,xargs可以解决
示例:
find | xargs COMMAND
find /sbin -perm +7000 | xargs ls -l
示例:
find -name “*.conf” -exec cp {} {}.orig ;
备份配置文件,添加.orig 这个扩展名
find /tmp -ctime +3 -user joe -ok rm {} ;
提示删除存在时间超过3天以上的joe 的临时文件
find ~ -perm -002 -exec chmod o-w {} ;
在你的主目录中寻找可被其它用户写入的文件
find /data –type f -perm 644 -name “*.sh” –exec chmod 755 {} ;
find /home –type d -ls
领取专属 10元无门槛券
私享最新 技术干货