linux find 命令

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一样,但是先询问用户(在标准输入),假如应答不是以yY开头,将不执行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, cm表示最后修改时间,a表示最后访问时间,c表示文件状态(元数据、inode)改变的时间。
    • 时间单位有两个:min, timemin表示精确到分钟,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的文件。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.