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笔记,可以更及时回复你的讨论。
