【问题标题】:How to remove all the results of a "find" command [duplicate]如何删除“查找”命令的所有结果[重复]
【发布时间】:2017-12-15 18:52:36
【问题描述】:

我有一个目录,其中包含多个以.pyc 结尾的文件,我想一次性将其全部删除。我都试过了

find . -name '*pyc' | rm

find . -name '*pyc' -exec rm

但是,这些语句都不符合用法(在第一种情况下)或语法正确(在第二种情况下,我得到find: -exec: no terminating ";" or "+")。如何将结果“管道”到“删除”命令?

【问题讨论】:

  • 你试过-delete吗?
  • ...虽然 -delete 是 GNUism,但并非在所有版本的 find 上都可用。
  • 是的,-delete 也适用于我的情况。

标签: bash


【解决方案1】:
rm *.pyc

如果它们都在同一个目录中,为什么还需要 find 命令?你已经找到了。

【讨论】:

  • 如果文件名多于单个命令行(现代系统上的内容通常约为 64-128kb),这将失败。因此,使用find
  • 另外,.pyc 文件也在子目录中,而不仅仅是顶级目录。
  • @KurtPeek,顺便提一下,如果您启用了shopt -s globstar(使用 bash 4.0 或更高版本作为您的 shell),那么rm *.pyc **/*.pyc 将递归到子目录中。
  • @KurtPeek - 你确实说过“一个目录”。
【解决方案2】:
find . -name '*.pyc' -exec rm -- '{}' +

来自man find

  • -exec utility [argument ...] ; 如果名为实用程序的程序返回零值作为其退出状态,则为真。可选参数可以传递给实用程序。表达式必须以分号 (;) 结束。如果你调用 从 shell 中查找,如果 shell 将其视为控制运算符,则可能需要引用分号。如果字符串 {} 出现在实用程序名称或参数中的任何位置 替换为当前文件的路径名。实用程序将从执行 find 的目录中执行。实用程序和参数不受外壳模式和结构的进一步扩展。

  • -exec utility [argument ...] {} +-exec 相同,但{} 被替换为与 每次调用实用程序都是可能的。此行为类似于 > xargs(1)。

{} 不需要在 bash 中引用,但这有助于与其他一些扩展 shell 的兼容性。

【讨论】:

    【解决方案3】:

    Why are the backslash and semicolon required with the find command's -exec option?之后,我使用了

    find . -name '*pyc' -exec rm {} \;
    

    【讨论】:

    • 每个文件运行一次rm。与-exec rm -- {} +(运行rm 将所有文件放到其命令行所需的最少次数)相比,处理大量文件的效率要低得多;如果没有-- 参数,它会将名为-r 的文件视为rm 的参数,而不是作为要删除的内容(如果您的find 操作没有像它那样在它前面加上./在这里)。
    猜你喜欢
    • 2015-06-21
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-04
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    相关资源
    最近更新 更多