如何从终端递归删除特定名称的文件

Kos*_*tas 3 terminal rm

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

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

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

Leo*_*zen 8

你可以用find和来做到这一点exec。这是一个执行您想要执行的操作的示例:

find -name '*~' -exec rm {} \;
Run Code Online (Sandbox Code Playgroud)

让我们分解它是如何工作的。该find命令将递归执行它的目录,默认情况下它将打印出它找到的所有内容。Using-name '*~'告诉我们只选择名称与 regex 匹配的条目*~。我们必须引用它,否则外壳可能会为我们扩展它。Using-exec rm {}rm针对它找到的每一件事执行,并{}作为文件名的占位符。(final;是需要告诉find这是命令结束的地方。这不是什么大不了的事,但如果你不使用它,它会发出呜呜声,什么也不做。这\是逃避它,因为它;是一个特殊的外壳字符。 )

  • 简短回答:这不会删除目录,也不需要`-type f`。更长的答案是,使用`-delete` 不适用于`-prune`,因为`-prune` 意味着`-depth`。在这种情况下无关紧要,但使用 `rm {}` 可以使其在以后的扩展性更强。另外,如果以后选择使用 GNU Parallel,它也能更好地与 GNU Parallel 配合使用。 (2认同)