find 命令的一般形式: find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]
其中[-H] [-L] [-P] [-D debugopts] [-Olevel]
并不常用,path
是find命令所查找的目录路径,默认是当前目录,可以指定多个搜索目录,expression
可以分为:-options [-opertaions ...]
。
find
命令还支持-a, -o, \( exp \)
来组合选项,-a, -o
分别表示逻辑与和逻辑或,\( exp \)
用于指定优先级。默认情况下,各个选项之间的bool值是逻辑与的关系。
-opertaions
选项详解
-print
,每个结果文件名单独一行输出到标准输出。默认操作。-
-fprint outfile
,与-print
一样,只是将结果输出到outfile。 -
-exec cmd
,find命令将对匹配的文件执行该参数所给出的shell命令。一般模式为:'cmd' {} \;
,{}
表示匹配的结果,即文件名,{
和}
之间不能有空格;\;
是必须的,表示命令的结束;{}
和\;
之间有空格。例如:find ./ -size 0 -exec rm {} \;
删除大小为0的文件。 -
-ok cmd
,同-exec
一样,但是先询问用户(在标准输入),假如应答不是以y
或Y
开头,将不执行command,返回假。 -
-ls
,将搜索到的结果用ls -l
命令形式的结果输出到标准输出。 -
-fls outfile
,同-ls
选项一样输出,只是结果输出到outfile。 -
-print0
,在标准输出上输出整个文件名,并后加一个空字符。则允许其他程序能正确处理在find输出中包含新行的文件名。 -
-fprint0 outfile
,与-print0
一样,只是输出到outfile。 -
-printf format
,格式化输出到标准输出。
-options
选项详解
-
-name
,按文件名查找,支持通配符*
、?
,如果使用了通配符,则必须用引号引起。例如:find . -name "*.sh"
,查找所有后缀为sh的文件。 -
-iname
, 与-name
一样,只是不区分文件名的大小写。 -
按文件的时间属性查找,可以结合时间属性类别、、取值来查找。、单位、取值来查找,还可以根据指定的文件来对比。
- 时间属性有三个:
m, a, c
。m
表示最后修改时间,a
表示最后访问时间,c
表示文件状态(元数据、inode)改变的时间。 - 时间单位有两个:
min, time
。min
表示精确到分钟,time
表示精确到天。 - 时间的数值取值也分三种:
-n, n, +n
。-n
返回小于n,n
返回正好等于n,+n
返回大于n。 - 举例:
find . -name "*.log" -mtime +5 -exec rm {} \;
在当前目录查找所有修改时间在5天前的以.log
结尾的文件,并删除;find . -name "*.log" -amin -5
在当前目录查找所有最后访问时间在5分钟内的以.log
结尾的文件;
- 与文件对比:
-anewer file, -cnewer file
,分别表示最后访问时间、文件状态改变时间比file新。 -newer file1 ! file2
, 查找修改时间比file1新,但比file2旧的文件。
- 时间属性有三个:
-type
,按类型查找。类型有下面这些:b
表示块设备文件d
表示目录c
表示字符设备文件p
表示管道文件l
表示符号链接文件f
表示普通文件。
-size
,按文件的长度来查找,必须指定长度n。- 算术属性:
-n, n, +n
,分别表示小于、刚好等于、大于n
。 - 值有单位,默认是块。还可以指定
c, k, m, g
,必须是小写,分别表示:字节B,KB,MB,GB。 - 举例:
find . -size -100c -f
表示查找文件长度小于于100字节的文件;find . -size 100k -f
表示查找长度刚好为100KB的文件;find . -size +100m -f
表示查找文件长度大于100MB的文件。
- 算术属性:
- 按目录深度查找
-depth
,按广度优先查找文件。先搜索目录,再搜索子目录。-maxdepth n
,搜索的最大深度,超过此深度的不再搜索。-mindepth n
,搜索的最小深度,小于此深度的不搜索。
-perm
,按文件权限来查找。如:find . -perm 755
。-
-path pattern
,搜索与pattern
匹配的路径,pattern
是正则表达式,不会把/.
当作特殊字符。例如:find . -path "./sr*sc"
将匹配./src/misc
,如果存在。注意,正则匹配作用在整个文件名上,从find
命令指定的路径开始,只有在命令指定的路径也是绝对路径时,正则才可以是绝对路径,例如:find bar -path /foo/bar/myfile
将不会匹配任何东西。 -
-prune
,默认值为true时,用于过滤特定的文件。如果使用-depth
选项,此选项无作用。一般结构是exclude-expr -o wanted-expr -print
是过滤的不需要的文件的表达式,wanted-expr -print
是输出需要的文件的表达式,-print
是必须的。 -
按文件所属的主和组来查找。
-user username
, 按文件的属主来查找。-nouser
, 查找无有效属主的文件,即属主不在/etc/passwd
中的。-group groupname
, 按文件所属的组来查找。-nogroup
, 查找无有效所属组的文件,即文件所属的组不在/etc/groups
中的。
-
-mount
,查找文件时不跨越文件系统mount节点。 -
-xdev
,查找文件时不跨越文件系统mount节点与-mount
效果一样。 -
-follow
,遇到符号链接文件,跟踪至链接所指向的文件。
举例
-
find . -type f -name "*.txt"
,查找所有以.txt
结尾的普通文件。 -
find / -type s -atime -1
,查找文件系统中的所有套接字文件,且最后访问时间在今天内的。 -
find . -type f -size 0c -exec rm {} \;
,查找所有长度为0字节的普通文件,并删除。 -
find . -type f -iname "*.log" -ok rm {} \;
,查找当前目录下所有后缀是不区分大小写的log
的文件,并删除,在删除前让用户确认。 -
find . -type f -name "*.xml" -ls
,将搜索到的所有xml文件用ls -l
的结果形式输出。 -
find . -path "./WEB-IN*" -name "*.xml" -print
,搜索当前目录下的匹配./WEB-IN*
的目录下的xml文件。 -
find . -path "./WEB-IN*" -prune -o -name "*.xml" -print
,搜索当前目录下的所有xml文件并输出到标准输出,但是不搜索匹配"./WEB-IN*
的目录及其子目录。 -
find . \( -path "./WEB-IN*" -prune -o -path "./META*" -prune \) -o -name "*.xml" -print
,搜索当前目录下的所有xml文件并输出到标准输出,但是不搜索匹配"./WEB-IN*
和"./META*"
的目录及其子目录。 -
find / -nouser -o -nogroup
,查找文件属主不在/etc/passwd
或文件所属组不在/etc/group
的文件。
欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论。