如何使用终端递归地删除特定名称的文件

3
我想删除所有子文件夹中的emacs备份(~)文件。我知道我可以在每个文件夹中使用cd并使用rm *~(例如备份文件test.cpp~)来删除它们。
如何使用一个命令删除这些文件,而不用在每个文件夹中进行cd?
(我尝试过rm -r *~rm -rf *~,但它们似乎不起作用)

说句公道话,建议尝试使用 rm -f *~ 而非 rm *~,因为如果没有备份文件,rm 将会抱怨找不到 *~。使用 -f 参数将避免其向你抱怨并带有错误退出。 - Leo Izen
4个回答

8
你可以使用findexec来完成这个操作。以下是一个示例,可以实现你想要的功能:
find -name '*~' -exec rm {} \;

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

为什么要使用“-exec rm {} ;”而不只是“-delete”? - Randy Morris
2
简短回答:这不会删除目录,也不需要“-type f”。更长的答案是,使用“-delete”与“-prune”不兼容,因为“-prune”意味着“-depth”。在这种情况下并不重要,但使用“rm {}”使其更具可扩展性。此外,如果以后选择使用GNU Parallel,则它也可以更好地工作。 - Leo Izen
据我所知,@RandyMorris也许是指-delete是一个GNU(和BSD)扩展,不在POSIX中,但我可能对此有所错误。 - Leo Izen
感谢您的解释。我非常确定删除emacs备份文件并不是真正需要关注的任务,但我很感激您的解释。 - Randy Morris
你说得对,在这种情况下并不重要,但我仍然喜欢使用find exec。 - Leo Izen

3

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

上述命令将递归查找文件夹中匹配模式的文件,并仅删除文件。


我们可以使用 ./ 来搜索当前目录,而不是使用 /path/to/directory/ - ctf0

2
您会使用find:
find ./ -name *~ -exec rm {} \;

这个命令会递归地列出所有与指定名称模式匹配的文件,然后对每个文件执行提供的命令,将花括号替换为文件名。
唯一棘手的部分是分号,因为它关闭了命令,但必须受到bash的保护,因此需要使用反斜杠。
更多选项请参见https://linux.die.net/man/1/find

1
如果在 ./ 目录下存在备份文件,这将无法工作,因为你还必须保护 *~ 以免被 bash 解释。你也需要引用 *~ - Leo Izen

0

首先,删除这些文件的最佳方法是不要创建它们(或者说,在一个中央位置创建它们):https://dev59.com/FnVC5IYBdhLWcg3w51hv#151946

以下是一种使用 Emacs 中的 find 命令收集文件列表并有选择地对其进行操作的方法。输入命令 M-x find-name-dired RET /path/to/files RET *~ RET 可以获取 /path/to/files/ 下所有备份文件,并将它们放入 dired 缓冲区。然后您可以像正常的 dired 操作一样标记文件,使用 m 反选,使用 t,并使用 D 删除所选内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接