【问题标题】:What does -prune option in find do?find 中的 -prune 选项有什么作用?
【发布时间】:2011-08-01 09:36:52
【问题描述】:

我可以看到find 的 -prune 无法正常工作。我猜-name "efence*" -prune 选项应该选择(或查找)除了名称为efence* 的文件之外的所有文件,对吧?

还是我的理解有误?

我执行的命令: find * -maxdepth 0 -name "efence*" -prune

期望:选择当前目录 (maxdepth 0) 中的所有文件,但名称为 *efence 的文件除外。

请帮我理解-prune

【问题讨论】:

  • 我打赌你会在Super User 上得到更好的答案。
  • 如何迁移?还是让管理员迁移?
  • 是的,它将由管理员迁移。
  • 对于投反对票的人..让我告诉你 find 也可以用在 shell 脚本上,而且 shell 脚本是程序。

标签: linux find


【解决方案1】:

试试

find * -maxdepth 0 -name "efence*" -prune -o -print

prune 选项确实打印匹配的文件,如果没有指定其他选项(但它仍然阻止 find 递归到匹配的目录)。

编辑添加说明:

find 表达式区分testsactions。来自man find

表达式由选项组成(影响整体操作 而不是处理特定的文件,并且总是返回true), 测试(返回真或假值)和动作(有 副作用并返回真或假值),全部由运算符分隔。 -and 假定运算符被省略。

如果表达式不包含除-prune 之外的任何操作,则对表达式为真的所有文件执行-print [我的重点]

所以-prune 是一个具有副作用的操作,find 不会递归到与前面的测试匹配的子目录(在你的情况下,-maxdepth 0 -name "efence*")。但就表达式的真值而言,就相当于只有

find * -maxdepth 0 -name "efence*" -true

并且由于您没有指定任何其他操作,因此假设为 -print(此假设始终存在,因为它允许您键入例如 find . -name "*.java" 而不是 find . -name "*.java" -print)。

希望这是有道理的。 the other thread 接受的答案谈到了同样的事情。

【讨论】:

  • 我接受你的回答,但请解释一下-o print 是如何发挥作用的。
  • 为了完整起见,作为对kingmasher1评论中问题的回应。 OpenSauce 解释的是 find * -maxdepth 0 -name "efence*"find * -maxdepth 0 -name "efence*" -prunefind * -maxdepth 0 -name "efence*" -prune -print 产生与 find * -maxdepth 0 -name "efence* -true" where -print 相同的结果,并且测试 -true ... 始终评估为“真”。 IE。使用该指令,您可以找到名称与模式"efence*" 匹配的所有文件。这里没有修剪的替代操作,因此find ..... -prune 实际上会打印它通常会修剪的内容。
  • [接上] 修剪的替代方法是 find * -maxdepth 0 -name "efence*" -prune -o -print 中的 -o -print 操作。在这种情况下,find * (....) -prune 部分实际上会在测试(...) 评估为“真”时修剪结果,并在没有结果时打印它。当您使用find 时,您会发现find * (...) - prune -o -print 的组合是一种常见的“条件打印模式”(我的术语)。
猜你喜欢
  • 2012-08-03
  • 2010-12-02
  • 2013-11-08
  • 1970-01-01
  • 2013-12-05
  • 1970-01-01
  • 2016-07-30
  • 2020-01-18
  • 2023-03-22
相关资源
最近更新 更多