find 命令,大致语法:find [<start-path>...] [<expr>...]。其本质是用指定表达式逐个评估起始路径(默认当前目录)下的所有文件,并返回最终结果为 true 的文件路径。后者是相对的还是绝对的取决于起始路径的相对/绝对情况

所以 find 命令的核心是逻辑表达式的执行,子表达式间的顺序会影响最终结果。子表达式可细分为:option、test、action,彼此间以操作符串联,无操作符则等同于-a,形如:
<option> [<oper>] <test> [<oper>] <action> ...

操作符

以下操作符按优先级从高到低排列:

  • \( <expr>... \):注意此处括号须被转义,且与内部表达式间留有空格
  • -not <expr>:取反
  • <expr1> -a <expr2>:表示和
  • <expr1> -o <expr2>:表示或,前一个表达式为 true 时后一个不再执行

option

必返回 true,并将影响当前指令的整体执行。-daystart-L-regex-type除外,后者仅影响指定在其之后的 test 的执行。常用 option 如下:

-L:后续的测试以及打印均针对软链接指向的文件,默认仅针对软链接本身

-mount:将挂载盘从查找范围中排除

test

用于逐个测试(匹配)起始路径下的所有文件,满足则返回 true,否则返回 false。常用 test 如下:

  • -mtime {+|-}<n>:上一次内容更新距今超过/少于 n*24 小时(atime、ctime 同理)
  • -newer <filepath>:内容比指定文件更早更新(anewer、cnewer 同理)
  • -user <uname>:属于指定用户(用户名或 ID)
  • -nouser:不属于任何用户
  • -group <gname>:属于指定组(组名或组 ID)
  • -nogroup:不属于任何组
  • -name <pattern>:其名称(basename)匹配指定模式
  • -path <pattern>:其路径匹配指定模式,注意该路径是相对还是绝对的取决于起始路径的相对/绝对情况
  • -type <char>:指定文件类型,对应关系如下

    • f:普通文件
    • d:目录
    • l:链接
    • b:块设备
    • c:字节设备
    • s:sockets
    • p:FIFO
  • -size {+|-}<n>:文件大小大于/小于指定数值。可用单位如下:

    • c:byte
    • w:2-byte
    • b:默认单位,512-byte
    • k:Kb
    • M:Mb
    • G:Gb

action

为当前评估结果为 true 的文件执行指定操作,返回 true 或 false 取决于具体 action。常用 action 如下:

  • -exec <command> \;:将该文件按占位符{}代入指定指令中执行,注意以\;收尾。若执行成功则返回 true
  • -prune:若该文件为目录,则不在其下继续展开。必返回 true

实例

  • 找出root/.vscode-server目录下的名为machineid的文件,且后者确定不在其binextensions子目录中:

    find /root/.vscode-server \( \
    -path '/root/.vscode-server/bin' -o \
    -path '/root/.vscode-server/extensions' \
    \) -prune -o -name machineid -print

Never_Mind
24 声望0 粉丝