10.1.5. 查找文件的语法

find(1) 被用作从归档中筛选文件也被用作拷贝命令 (参见第 10.1.3 节 “归档语法”第 10.1.4 节 “复制语法”) 或者用于 xargs(1) (参见第 9.3.9 节 “使用文件循环来重复一个命令”)。通过 find 的命令行参数能够使其功能得到加强。

以下是 find(1)基本语法的总结。

  • find 条件参数的运算规则是从左到右。

  • 一旦输出是确定的,那么运算就会停止。

  • “逻辑 OR“ (由条件之间的 “-o“ 参数指定的)优先级低于 “逻辑 AND“ (由 “-a“ 参数指定或者条件之间没有任何参数)。

  • ”逻辑 NOT“ (由条件前面的 “!“ 指定) 优先级高于 “逻辑 AND”。

  • -prune“ 总是返回逻辑 TRUE 并且如果这个目录是存在的,将会搜索除这个目录以外的文件。

  • -name“ 选项匹配带有 shell 通配符 (参见第 1.5.6 节 “Shell 通配符”) 的文件名但也匹配带有类似 “*“ 和 “?“ 元字符的 .“。(新的 POSIX 特性)

  • -regex“ 匹配整个文件路径,默认采用 emacs 风格的 BRE (参见第 1.6.2 节 “正则表达式”)。

  • -size“ 根据文件大小来匹配 (值前面带有 “+“ 号匹配更大的文件,值前面带有 “-“ 号匹配更小的文件)

  • -newer“ 参数匹配比参数名中指定的文件还要新的文件。

  • -print0“ 参数总是返回逻辑 TRUE 并将完整文件名 (null terminated) 打印到标准输出设备上。

如下是 find(1) 语法格式。

  1. # find /path/to \
  2. -xdev -regextype posix-extended \
  3. -type f -regex ".*\.cpio|.*~" -prune -o \
  4. -type d -regex ".*/\.git" -prune -o \
  5. -type f -size +99M -prune -o \
  6. -type f -newer /path/to/timestamp -print0

这些命令会执行如下动作。

  1. 查找 “/path/to“ 下的所有文件

  2. 限定全局查找的文件系统并且使用的是 ERE (参见第 1.6.2 节 “正则表达式”)

  3. 通过停止处理的方式来排除匹配 “.*\.cpio“ 或 “.*~“ 正则表达式的文件

  4. 通过停止处理的方式来排除匹配 “.*/\.git“ 正则表达式的目录

  5. 通过停止处理的方式来排除比 99MB (1048576字节单元) 更大的文件

  6. 显示文件名,满足以上搜索条件并且比 “/path/to/timestamp“ 新的文件

请留心以上例子中的 “-prune -o“ 排除文件的习惯用法。

[注意]注意

对于非 Debian 系的 Unix-like 系统,有些参数可能不被 find(1) 命令所支持。在这种情况下,应该考虑调整匹配方法并用 “-print“ 替代 “-print0“。你可能同样需要更改其他相关的命令。