find命令用来在指定目录下面查找文件,是linux默认自带的文件搜索工具,功能相当丰富强大,使用语法如下:
usage:find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]find [-H | -L | -P] [-EXdsx] -f path [path ...] [expression]
[-H] 除命令中指定的软连接外,不搜寻路径中软连接下的结果
[-L] 搜寻结果包括路径中的软连接下的结果
[-P] 不搜寻路径中软连接下的结果,默认使用此参数
所以如果不用到这些个前置参数,那么使用语法其实可以简化为:
find path ... [expression]
path:find命令所查找的目录路径
expression:expression可以分为“-options [-print -exec -ok ...]”
其中-options [-print -exec -ok ...]解释如下:
-options,指定相关选项,常用选项下文在介绍
-print,将匹配的文件输出到标准输出
-exec,将find命令的匹配结果传给exec后接的命令。相应命令的形式为“command {} \;”,下文会有示例
-ok,和-exec的作用相同,区别就是在执行每一个命令之前,都会给出提示,让用户来确定是否执行
二、find命令的常用选项及示例
1、按照文件名称查找,使用-name 指定查找的文件名称,支持正则匹配
1.1 查找当前目录下所有的java源文件
find . -name "*.java"
1.2 查找/temp下所有以大写字母开头的log文件
find temp -name "[A-Z]*.log"
1.3 在当前目录下查找不是 a 开头的 log 文件
-prune 表示把前面命令所匹配到的路径排除
-o表示或
-a 表示与
find . -name "a*" -prune -o -name "*.log"
1.4 在当前目录除 git 子目录外查找java源文件
find . -path "./git" -prune -o -name "*.java"
2、按照文件类型查找
f - 普通文件 d - 目录 b - 块设备文件 c - 字符设备文件 p - 管道文件 l - 符号链接文件
2.1 查找当前目录下的普通文件且以log结尾
find . -type f -name "*.log"
2.2 查找当前目录下的软连接文件
find . -type l
3、使用-permz指定权限查找
3.1 查找当前目录权限为 644 的文件
find . -type f -perm 644
3.2 查找/etc/目录下权限为111的文件
find /etc -perm -111
4. 根据文件属主和属组进行查找
4.1 查找当前目录下面用户属主为abobo的文件,-user指定用户
find . -user aboboo
4.2 查找当前目前下面属组为aboboo的文件,-group指定用户组
find . -group aboboo
4.3 查找当前目录无有效用户属主的文件
find . -nouser
4.4 查找当前目录无有效所属组的文件
find . –nogroup
5. 使用-size指定文件大小进行查找
5.1 查找当前目录下小于20k的文件
find . -size -20k -type f
5.2 查找当前目录下大于500M的文件
find . -size +500M -type f
6. 按照时间进行查找
6.1 查找3天内被修改过的文件,-mtime 表示内容修改时间
find . -mtime -3 -type f
6.2 查找一天内被访问的文件,-atime 表示访问时间
find . -atime -1 -type f
6.3 查找一天内状态被改变的文件,-ctime 表示元数据被变化时间
find . -ctime -1 -type f
6.4 查找比aboboo.txt更新的文件
find . -newer "aboboo.txt" -type f
7. 查找后执行指定动作
7.1 以 ls 长文件的格式形式输出查找到的txt结尾的文件
find . -name "*.txt" -ls
7.2 删除查找到的文件
find . -size +500M -delete
7.3 删除0字节的空文件
find -type f -size 0 -exec rm -rf {} \;
三、find命令与xargs命令
在使用-exec选项处理匹配到的文件时,其实有一个限制,因为有些linux命令是有命令长度限制的,所以如果find的匹配结果太多,那么传给exec的制定命令去执行时,就会报错“参数列太长”或“参数列溢出”。这种情况就可以使用xargs很好的解决这个限制。
xargs能够捕获一个命令的输出,然后传递给另外一个命令。可以组合多个命令一起使用,一般和管道一起使用。关于这个命令的详细介绍,后面也会总结一篇文章来详细介绍,这里给出几个常用的使用示例。
find . -type f -name "*.log" | xargs grep "aboboo"
find . -mtime +7 |xargs rm -fr
小结:




