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

How to delete files of certain name from terminal recursively

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

如何使用一个命令删除这些文件,而不用 cd 在每个文件夹中?

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

您将使用查找:

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

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

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

有关更多选项,请参阅 https://linux.die.net/man/1/find

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

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

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

首先,删除这些文件的最佳方法是不创建它们(或者更确切地说,在一个中心位置创建它们):

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

删除选择

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

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