Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bash find,仅删除文件-参数顺序_Bash_Find_Positional Operator_Find Util - Fatal编程技术网

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

bash find,仅删除文件-参数顺序,bash,find,positional-operator,find-util,Bash,Find,Positional Operator,Find Util,假设今天是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 -typ

假设今天是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 
  • 使用正确的抽象术语expression,引用以
    -mtime…
    开头的参数列表
  • 相反,OP将此列表称为选项[编辑:在自删除的帖子中]
将它们称为“选项”是可以理解的,但由于它们不是选项这一事实本身就是问题的原因,因此需要仔细研究find的术语和概念

  • 遵循输入路径的参数统称为表达式
  • 表达式由以下内容组成:
    • 测试(例如,
      -f型
    • 操作(例如,
      -删除
    • 选项(例如,
      -maxdepth 1
      )-请注意,这些选项与标准选项不同,标准选项甚至必须位于输入路径之前(例如,
      查找-L/tmp…
    • 注意:上面是GNU
      find
      术语,它比中的术语更细粒度,其中所有三个结构都由一个名称调用,primaries(BSD
      find
      也仅在其
      man
      页面中使用primaries)
    • 运算符
      -a
      -和
      )表示逻辑and;
      -o
      -或
      )表示逻辑and;
      -非
      )表示否定;括号中的替代形式不符合POSIX,但由GNU和BSD find支持
  • 运算符将测试和操作组合成布尔表达式
    • 在没有显式运算符的情况下,测试和操作由隐式逻辑and(
      -a
      连接
    • -a
      -o
      应用短路(见下文)
    • 子表达式可以与
      \(
      \)
      组合以改变优先级(
      \
      -转义是为了保护括号不被shell解释)
    • 优先级(最高优先):
      \(…\)
      -a
      -o
  • 关于测试和行动的顺序问题
    • 相比之下,
      find
      选项不是位置选项,但是GNU
      find
      默认情况下会发出警告,如果它们没有放在测试和操作之前。为了避免警告,并且为了概念的清晰,最好这样做
  • 每个测试和操作都返回一个布尔值,短路应用
    • 典型情况下-隐含
      -a
      -这意味着一旦先前的测试或操作返回false,则不会评估后续测试和操作
      • find-错误-打印#-未执行打印
    • 类似地,如果第一个操作数返回true,则不会执行
      -o
      -或
      )表达式的第二个操作数:
      • find-打印-o-打印#!!第二次-未执行打印