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

Posted

技术标签:

【中文标题】bash 查找,仅删除文件 - 参数顺序【英文标题】:bash find, only delete files - order of arguments 【发布时间】:2015-06-14 03:28:05 【问题描述】:

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

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

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

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

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

谢谢!

【问题讨论】:

【参考方案1】:

find 命令按顺序执行表达式。因为-delete-type 之前,所以永远不会到达-type。试试:

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

【讨论】:

【参考方案2】: David C. Rankin's helpful answer 使用正确的abstract 术语expression 来引用以-mtime ... 开头的参数列表。 相比之下,OP 将此列表称为 options [编辑:在已删除的帖子中]。

称它们为“选项”是可以理解的,但由于它们不是选项正是问题的原因find' s 术语和概念值得仔细研究

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

【讨论】:

以上是关于bash 查找,仅删除文件 - 参数顺序的主要内容,如果未能解决你的问题,请参考以下文章

从 shell 脚本 (bash) 的参数列表中删除最后一个参数

如何从 Bash 中的路径字符串中删除文件后缀和路径部分?

sh Bash查找和删除文件

在 bash 中查找超过 X 天的文件并删除

在bash shell 上如何按字母顺序比较两个字符串 ?

通过 Bash 从文本文件中删除空行,包括空格字符 [重复]