find命令用来查找文件(在当前目录以及当前目录的子目录下查找),该命令能够基于正则表达式、目录树深度、文件日期、文件类型等条件查找文件。
一、根据文件名或正则表达式搜索文件
- 根据名称搜索
用法1: find path -name 'filename'
用法2: find path -iname 'filename'
两种用法都支持通配符,其中,用法1区分大小写, 用法2不区分大小写。实例:查找当前目录下以.sh结尾的文件,命令如下:
find . -name '*.sh'
- 使用逻辑操作符,按多个条件搜索。-a 和 -and 为逻辑与, -o 和 -or 为逻辑或。
实例:找出当前目录下以.sh结尾并且文件名中含有test的文件,命令如下:
find . -name '*.sh' -a -name '*test*'
- 使用正则表达式
-regex 选项可以根据正则匹配文件,也可使用-iregex不区分大小写。 实例:查找当前目录下以.sh或.sample结尾的文件,命令如下:
find . -regex '.*\.\(sh\|sample\)$'
拓展:如何查找文件名不包含某个字符的文件
例:查找文件名中不包含test且以.sh结尾的文件,命令如下:
find . -name '.sh' -a ! -name 'test'
例:查找除了.git目录以外,以.sh结尾的文件
find . -name '.git' -prune -o -name '.sh'
二、根据路径搜索
-path可以限制匹配文件的路径以及名称。
实例:查找test目录下,以.sh结尾的文件
find . -name '*.sh' -path '*/test/*'
三、根据目录深度搜索
-maxdepth 和 -mindepth选项可以限制find命令遍历的目录深度。
实例:只在当前目录下查找.sh结尾的文件,命令如下:
find . -maxdepth 1 -name '*.sh'
四、根据文件类型搜索
类UNIX系统中,文件类型包括普通文件、目录、字符设备、符号链接、套接字等。find命令通过-type属性对文件类型进行过滤。
例:查找当前目录下所有的目录,包括下一级子目录,命令如下,
find . -maxdepth 2 -type d
-type选项支持的参数对应的文件类型如下:
文件类型 | 参数值 |
---|---|
普通文件 | f |
符号链接 | l |
目录 | d |
字符设备 | c |
块设备 | b |
套接字 | s |
FIFO | p |
五、根据文件的时间戳搜索
类unix系统中每个文件都有三种时间戳
- 访问时间(-atime、-amin):用户最近一次访问文件的时间。
- 修改时间(-mtime、-mmin):文件最后一次被修改的时间。
- 元数据更改时间(-ctime、-cmin) :文件权限、所有权等最后一次被修改的时间。
time结尾的选项,其单位为天,min结尾的选项其单位为分钟,这些选项的值都为一个正负整数, 如+7,表示,7天以前被访问过的文件,-7表示7天以内被访问过的文件,7表示恰好7天前被访问的文件。
例:
1、七分钟以内被修改的文件
find . -mtime -7
2、七天以前被访问过的文件
find . -atime +7
拓展: -newer选项可以比较修改时间
例:找出比test.sh文件的修改时间更近的文件
find . -type f -newer test.sh
六、根据文件大小搜索
# 大于2k的文件
find -type f -size +2k
# 小于2k的文件
find -type f -size -2k
# 等于2k的文件
find -type f -size 2k
支持的单位,除了k之外,还有如下几个
- b:块(512字节)
- c:字节
- w: 字(2个字节)
- k:千字节(1024个字节)
- M :兆字节(1024k)
- G:吉字节(1024M)
七、基于文件权限和所有权搜索
# 打印权限为644的文件
find -type f -perm 644
# 打印用户www拥有的文件
find -type f -user www
八、利用find搜索结果执行相应的命令
- 删除操作
-delete选项可以直接删除搜索到的文件
find . -name '*test2*' -delete
- 调用其他命令
-exec选项可以调用其他命令,对搜索结果执行相应的操作
将所有以.sh结尾的文件都合并到all_shell.txt文件中
find . -type f -name '*.sh' -exec cat {} >all_shell.txt \;
命令中的{},find会将它替换为搜索到的文件名。命令结尾的;,是cat命令的结束符,而不是find命令的结束符,所以需要转义。