2

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

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

然后,假设我想删除 /tmp 中所有早于一天的文件,但不是目录,我执行以下命令:

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

如果目录“hello”不是文件,为什么会删除它?

谢谢!

4

2 回答 2

5

find 命令按顺序执行表达式。既然-delete是 before -type-type就永远不会到达。尝试:

find /tmp -mtime +1 -type f -delete 
于 2015-04-08T23:27:50.783 回答
2
  • David C. Rankin 的有用答案使用正确的抽象术语expression来引用以 开头的参数列表-mtime ...
  • 相比之下,OP 将此列表选项称为[编辑:在已删除的帖子中]。

称它们为“选项”是可以理解的,但由于它们不是选项这一事实是问题的原因,因此需要find仔细研究它们的术语和概念

  • 输入路径后面的参数统称为表达式
  • 表达式由以下部分组成:
    • 测试(例如,-type f
    • 动作(例如,-delete
    • 选项(例如,-maxdepth 1) - 请注意,此类选项与标准选项不同,标准选项甚至必须位于输入路径之前(例如,find -L /tmp ...
    • 注意:以上是GNU术语,它比 POSIX 规范find中的更细粒度。forfind,其中所有三个构造都由一个名称调用 primaries BSD find只在其页面中使用primaries )。man
    • 运算符:( ) 表示逻辑 AND,-a( ) 表示逻辑 OR,( )表示否定;括号中的替代形式不符合 POSIX,但受 GNU 和 BSD find 支持。-and-o-or!-not
  • 运算符将测试和动作组合成布尔表达式
    • 在没有显式运算符的情况下,测试和操作由隐式逻辑 AND ( -a)连接。
    • -a-o应用短路(见下文)
    • 子表达式可以分组\(\)改变优先级(\-转义是为了保护括号不被shell解释)。
    • 优先级(最高优先):\(...\), !, -a,-o
  • 关于测试和操作的顺序问题
    • find 相比之下,options不是位置的,但如果它们没有放在测试和操作之前, GNU默认会发出警告。 为了避免警告,并且为了总体上的概念清晰,最好这样做。find
  • 每个测试操作都返回一个 Boolean,并且短路适用
    • 典型情况下--a隐含 - 这意味着一旦先前的测试或操作返回 false ,则不会评估后续测试和操作
      • find . -false -print # !! -print is NOT executed
    • -o同样,如果( ) 表达式的第二个操作数-or返回 true,则不会执行第一个操作数:
      • find . -print -o -print # !! 2nd -print is NOT executed
于 2015-04-12T17:29:37.863 回答