Linux系统中文件查找命令 find和locate
Linux系统中文件查找
关键词 文件查找 | find | locate
本文主要介绍有关文件查找的两个命令——find和locate,以及压缩打包的命令——compress, gzip,bzip2,xz等。
locate
locate命令是通过查询Linux系统上预先构建的文件索引数据库,准确说来,这个数据库默认的位置是/var/lib/mlocate/mlocate.db,这个数据库一般由系统定时周期性更新,当然也可以通过updatedb命令手动更新,但是花费的时间周期可能很长,尤其在文件系统占用率很高的情况下。
locate命令查找的特点:
查找速度快 模糊查找 非实时查找
命令格式及常用选项:
locate [OPTION]... PATTERN... -h, --help 查看帮助文档 -i 忽略大小写搜索 -n N 最多显示N个匹配项目 -r, --regexp 支持进行基本正则表达式匹配,默认支持glob统配符 --regex 支持使用扩展正则表达式 -c 统计搜索到匹配的条目,但不输出具体条目
find命令
相对于locate命令,find命令查找有如下特点
查询速度较快 精确查找 实时查找
语法:
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression] [-H] [-L] [-P] 三选项用来控制处理符号链接文件 [-D] 控制dubug [-O] 查询,设置优化等级
以上5个参数基本不用,如果需要使用,位置必须在路径[path]之前
常用格式: find [OPTION]... [查找路径] [查找条件] [处理动作]
查找路径:指定需要查找的目录,如果是当前目录,可用“.”代替
查找条件:指定查找标准,可以是文件名、大小、权限等
处理动作:对符合条件的文件进行操作,默认输出至屏幕
接下来详细介绍查找条件:
根据文件名查找
-name, 直接查找文件名,支持glob风格查找 -iname, 不区分大小写,支持glob风格查找 -regex, 支持正则表达式查找文件名 -iregex, 不区分大小写,支持正则表达式查找文件名 注意:如果对glob不了解,可以用man 7 glob查看
根据文件从属关系查找
-user, 根据属主查找 -group, 根据属组查找 -uid 根据属主id查找 -gid 根据属组id查找 -nouser 判断是否属于无属主文件 -nogroup 判断是否属于无属组文件
根据文件类型查找
-type
常见文件类型有
f 普通文件 d 目录文件 l 符号链接文件 b 块文件 c 字符设备文件 p 管道文件 s 套接字文件
以文件大小查找
-size[+|-] UNIT 常用单位:k, M, G
以时间戳查找
以“天”为单位: -atime[+|-] -mtime -ctime 以“分钟”为单位: -amin -mmin -cmin
根据权限查找
-perm [/|-] mode mode: 精确权限匹配 -mode /mode: 任何一类用户的权限满足即可 +mode: 已废弃这种用法
处理动作
-print 输出至标准输出,默认的动作 -ls 类似于对查找的文件执行"ls -l"命令,输出文件的详细信息 -delete 删除查找到的文件 -fls file 把查找到的所有文件的长格式信息保存到指定文件 -ok CMD {} \; 执行CMD,执行前询问 -exec CMD {} \; 执行CMD
组合测试
各个条件之间默认是以“与”连接,如果需要使用其他组合测试,必须加上
-a 与 -o 或 -not, ! 非
德·摩根定律
(非 P) 或 (非 Q) = 非(P 且 Q) (非 P) 且 (非 Q) = 非(P 或 Q)
练习
1、查找/var目录下属主为root,且属组为mail的所有文件或目录;
# find /var -user root -group mail
2、查找/usr目录下不属于root、lp或gdm的所有文件或目录;
# find /usr -not -user root \ -a -not -user lp -a -not -user gdm # find /usr -not \( -user root -o -user lp -o -user gdm \)
3、查找/etc目录下最周一周内其内容修改过,同时属主不为root,也不是postfix的文件或目录;
# find /etc -mtime -7 -a -not -user root -a -not -user postfix # find /etc/ -mtime -7 -a -not \( -user root -o -user postfix \)
4、查找当前系统上没有属主或属组,且最近一个周内曾被访问过的文件或目录;
# find / \( -nouser -o -nogroup \) -a -atime -7 # find / \( -atime -7 -nouser -o -nogroup \) -ls
5、查找/etc目录下大于1M且类型为普通文件的所有文件;
# find /etc -size +1M -type f
6、查找/etc目录下所有用户都没有写权限的文件;