find命令详解
大家或多或少使用过windows的文件查找,针对整个文件系统、部分分区,以文件名、时间等条件来进行文件查找。在Linux中主要通过locate和find这两个命令,来完成对文件查找。
首先,简单讲一下locate和find这两个命令的适应场景和各自特点。locate和find在Linux中都可以实现基于文件系统查找符合条件的文件,却有各自的特点和使用场景。locate命令在文件系统上实现文件查找,是基于事先构建好的搜索数据库来完成的。locate命令通过搜索数据库,而不是每次查找都遍历指定的文件系统,因此,可以快速的检索查找统计出符合条件的文件。
locate命令搜索查找的是数据库,数据库中有的文件,可以快速的查找,数据库中还未更新的,则无法查找到,因此通过locate命令查找文件,是非实时的查找,最近创建的文件还未在数据库中建立相关的索引等信息,无法查找到。
locate有两种更新搜索数据库的方法:
1、系统制定的计划任务,搜索遍历整个根文件系统,来自动完成数据库的更新
2、updatedb命令,手动更新数据库
因此,locate命令适用于非实时的、模糊的、快速查找
locate命令基本用法:
locate [option]...[pattern]...
常用选项:
-h 帮助信息
-i 忽略大小写
-c 统计共有多少符合条件的文件
-b 只显示匹配路径中的基名
-r 支持使用正则表达式来匹配pattern
一般,在Linux中locate命令查找文件,使用较少,多使用find命令,实现实时精确的文件查找。
find命令详解
find查找命令,是通过遍历指定的文件系统,匹配查找模式来完成查找,是实时的、精确查找。
find命令的基本用法:
find [option]...[查找文件路径] [查找条件] [查找后的处理动作]
常用选项:一般使用较少
查找文件路径:查找文件的起始路径,默认是当前工作目录
查找条件:指定的查找标准,可以是文件名、文件的大小、文件的类型、权限、从属关系、时间戳等标准来查找,默认为查找指定路径下的所有文件。
处理动作:对符合条件的文件作出操作,默认为标准输出。
备注:find查找文件,默认是glob文件名通配,而非正则表达元字符通配
查找条件:
-name "pattern" 根据文件名来查找文件
-iname "pattern" 根据文件名查找文件,忽略大小写
实例:
#find /etc -name pass* #在/etc目录下查找文件名以pass开头的文件
#find / -name pass* #在根目录下查找文件名以pass开头的文件
-regex "pattern" 根据正则表达式匹配查找
在find中使用较少,正则表达式工作在贪婪模式下,匹配的是整个路径而非基名
-user username 查找属主为指定用户的文件
-group groupname 查找属组为指定组的文件
-uid UID 查找属主为指定UID的文件
-gid GID 查找属组为指定GID的文件
-nouser 查找没有属主的文件
-nogroup 查找没有属组的文件
组合测试:
与:-a 默认组合逻辑
或:-o
非:-not或!
备注:组合测试时如用括号需转义 \( \)
-type TYPE 根据文件类型查找
f普通文件 d目录 l链接文件 b块设备 c字符设备文件 p管道 s套接字
-size [+|-]#单位 根据文件大小来查找
常用单位:k M G
备注:-size 3M:查找出来的文件是满足小于4M大于2M的范围的文件
-size +3M:查找的是4M及大于4M的文件
-size -3M:查找的是2M及小于2M的文件
根据时间戳查找
以天为单位
-atime [+|-]#
-mtime [+|-]#
-ctime [+|-]#
以分为单位
-amin [+|-]#
-mmin [+|-]#
-cmin [+|-]#
实例:#find /etc -mtime -7 #查找7天内修改过的文件
根据权限查找
-perm [/|-]mode
备注:-perm mode:精确匹配权限位
-perm /mode:任意一类用户(u,g,o)的任何权限位,任何一个符合条件即满足(9个权限位只要有一个满足即可,是或的逻辑关系)
-perm -mode:每一类用户(u,g,o)的权限位(r,w,x)的每一位,同时符合条件即满足(9个权限位之间是与的逻辑关系)
实例:#find /etc -not -perm /222 -type f #查找所有用户都没有写权限的文件
处理动作:
-print 输出至标准输出,默认动作
-ls 类似于对查找到的文件执行"ls -l"命令,输出文件的详细信息
-delete 删除查找到的文件
-fls /path/to/file 把查找到的所有文件的长格式信息保存至指定的文件中
-ok command {} \; 对查找到的每个文件都交给command来执行,每个文件执行都要用户确认
-exec command {} \; 对查找到的每个文件都交给command来执行,不需要用户确认
备注:find查找到的文件路径传给后面的command,是先查找出所有符合条件的文件路径,并一次性传递给后面的命令,但是有些command不能接受过长的参数,此时command执行会失败。另有一种方式可以规避此问题:#find ... | xargs command