bash 查找,仅删除文件 - 参数顺序

bash find, only delete files - order of arguments

假设今天是 4 月 8 日,我在 bash 中执行以下操作。

cd /tmp
mkdir hello
touch -d 2015-04-01 hello

然后,假设我想删除 /tmp 中超过一天的所有文件,但不删除目录,然后我执行此操作:

find /tmp -mtime +1 -delete -type f

如果目录 "hello" 不是文件,为什么会被删除?

谢谢!

find命令按顺序执行表达式。由于 -delete-type 之前,因此永远不会达到 -type。尝试:

find /tmp -mtime +1 -type f -delete 
  • 使用正确的 abstract 术语 expression 来引用以 [=10 开头的参数列表=].
  • 相比之下,OP 将此列表称为 options [编辑:在已删除的 post].

将它们称为 "options" 是可以理解的,但是由于 它们 不是 选项这一事实是问题的原因, find 的术语和概念值得仔细研究:

  • 输入路径后面的参数统称为表达式
  • 一个表达式由以下部分组成:
    • 测试(例如,-type f
    • 操作(例如,-delete
    • options(例如,-maxdepth 1) - 请注意,此类选项不同于 standard 必须出现的选项 甚至在输入路径之前(例如,find -L /tmp ...
    • 注意:以上是 GNU find 术语,比 POSIX spec. for find 中的术语更细化,这三个结构都由 single 名称调用,primariesBSD find 也仅使用 primaries 在其 man 页面中)。
    • 运算符-a (-and) 用于逻辑与,-o (-or) 用于逻辑或,以及! (-not) 表示否定;括号中的替代形式不符合 POSIX,但受 GNU 和 BSD find 支持。
  • 运算符将测试和动作组合成布尔表达式
    • 在没有显式运算符的情况下,测试和操作通过隐式逻辑 AND (-a).
    • 连接
    • -a-o 应用 短路 (见下文)
    • 子表达式可以与 \(\) 分组以改变优先级(\-转义是为了保护括号来自 shell).
    • 的解释
    • 优先级(高在先):\(...\)!-a-o
  • 关于测试和操作的顺序很重要
    • find 选项,相比之下,不是位置,而是GNU find 默认情况下会发出警告,如果它们未放置在 之前 测试和操作。为了避免警告,并且为了概念清晰,最好这样做。
  • Every test and action returns a Boolean, and 短路应用
    • 典型情况下 - 隐含-a - 这意味着后续测试和操作不会被评估,一旦先前的测试或操作已返回 false
      • find . -false -print # !! -print is NOT executed
    • 类似地,如果第一个操作数返回真,则 -o (-or) 表达式的第二个操作数不会执行:
      • find . -print -o -print # !! 2nd -print is NOT executed