【问题标题】:How to delete files of certain name from terminal recursively如何从终端递归删除特定名称的文件
【发布时间】:2017-08-08 21:28:43
【问题描述】:

我想从子文件夹中删除所有 emacs 备份 (~) 文件。 我知道我可以在每个文件夹中 cd 并使用 rm *~ 删除它们(例如,用于备份文件 test.cpp~)。

如何使用一个命令删除这些文件,而无需在每个文件夹中进行 cd'ing?

(我尝试了rm -r *~rm -rf *~,但它们似乎不起作用)

【问题讨论】:

  • 为了记录,最好尝试rm -f *~ 而不是rm *~,因为如果没有备份文件,rm 会抱怨找不到*~。使用-f 将使它不会对你发牢骚并退出错误。

标签: terminal rm


【解决方案1】:

你会使用 find:

find ./ -name *~ -exec rm {} \;

此命令将递归列出所有与指定名称模式匹配的文件。然后它将执行为每个文件提供的命令,用文件名替换花括号。

唯一棘手的部分是分号,因为它是关闭命令,但它必须受到 bash 保护,因此是反斜杠。

请参阅https://linux.die.net/man/1/find 了解更多选项。

【讨论】:

  • 如果./ 中有备份文件,这将不起作用,因为您必须保护*~ 免受bash 攻击。您还需要引用*~
【解决方案2】:

您可以使用findexec 执行此操作。这是一个执行您想要执行的操作的示例:

find -name '*~' -exec rm {} \;

让我们分解它是如何工作的。 find 命令将通过执行它的目录进行递归,默认情况下它将打印出它找到的所有内容。使用-name '*~' 告诉我们只选择名称与正则表达式*~ 匹配的条目。我们必须引用它,否则 shell 可能会为我们扩展它。使用-exec rm {} 将为它找到的每个东西执行rm{} 作为文件名的占位符。 (最后的; 需要告诉find 这是命令结束的地方。这并不是什么大不了的事,但如果你不使用它,它会发牢骚并且什么也不做。\ 是转义它,因为 ; 是一个特殊的 shell 字符。)

【讨论】:

  • 为什么是-exec rm {} \; 而不仅仅是-delete
  • 简答:这不会删除目录,也不需要-type f。更长的答案是使用-delete 不适用于-prune,因为-prune 意味着-depth。在这种情况下没关系,但使用rm {} 使其在以后更具可扩展性。另外,如果以后选择使用 GNU Parallel,它也能更好地工作。
  • @RandyMorris 也是 afaik -delete 是一个 GNU(和 BSD)扩展,不在 POSIX 中,但我可能错了。
  • 感谢您的解释。我很确定删除 emacs 备份文件并不是一项真正值得您考虑的任务,但我很欣赏您的推理。
  • 你说得对,在这种情况下没关系,但我还是喜欢 find exec。
【解决方案3】:

首先,删除这些文件的最佳方法是不创建它们(或者更确切地说,在中心位置创建它们):https://stackoverflow.com/a/151946/245173

这是一种使用 Emacs 中的 find 收集文件列表并有选择地对它们执行操作的方法。 M-x find-name-dired RET /path/to/files RET *~ RET 应该得到/path/to/files/ 下的所有备份文件并将它们放在一个dired 缓冲区中。然后你可以做一些正常的事情,比如用m标记文件,用t反转选择,用D删除选择。

【讨论】:

    【解决方案4】:

    find /path/to/directory/ -type f -name '*filtercondition*' -delete

    上面的命令会在匹配模式的文件夹中递归查找文件并只删除文件

    【讨论】:

    • 我们可以使用./代替/path/to/directory/在当前搜索。
    猜你喜欢
    • 2011-04-08
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2012-11-29
    • 2020-03-25
    相关资源
    最近更新 更多