如何删除与模式匹配的所有文件?

当我在Mercurial中还原时,会留下几个.orig文件。我希望能够运行一个命令来删除所有这些文件。
我找到了一些资料,说要运行以下命令:
rm **/*.orig

但是这给了我一个信息:
rm: cannot remove `**/*.orig': No such file or directory

我也尝试了这些命令:

rm -rv *.orig
rm -R *\.orig

1请查看 https://superuser.com/a/699287/92334 - Ilya Serbis
4个回答

使用find命令(小心使用!)

find . -name '*.orig' #-delete

我已经注释掉了删除命令,但是一旦你对它的匹配结果满意,只需从该行中移除#,它就会删除所有这些文件。

1这个能递归地工作吗? - Frank Barcenas
4@FrankBarcenas 是的 - find 命令可以递归地执行所有操作。如果你想限制其工作方式,可以尝试调整 -maxdepth-mindepth 参数。 - Oli
22一定要将-delete放在标志的末尾。find . -delete -name '*.orig'会忽略过滤器并覆盖整个目录。 - Michael
如何从文件中提取模式,例如.gitignore文件。 - kyb
@kyb,听起来你想要使用git clean命令。也许加上-i-n选项可以更安全一些? - Michael
2@Michael,是的。我已经用git clean -fdx解决了这个问题。 - kyb
find -type f ...将防止警告,如果一个(非空)目录恰好有一个类似*.orig的名称。 - Déjà vu
可以用grep命令来完成,然后将其通过管道传递给rm吗? - kamal
1@kamal 我可能仍然会使用find命令,但结合其-regex-iregex谓词。有时,在处理文件名(当你在管道中传递它们时)时,安全地进行解析可能会很困难。 - Oli

"find"具有一些非常先进的技术,可以搜索所有或当前目录并删除文件。
find ./ -name ".orig" -exec rm -rf {} \;

4使用-delete有什么好处? - muru
@muru 如果你删除 -rf,我猜你会为每个文件得到一个提示。 - Peter
@Peter 不一定。即使如此,又怎样呢?答案使用了“-rf”,而“find”命令有“-ok”。 - muru
1@muru 看起来-delete命令不能删除文件夹。 - Andrii Karaivanskyi
@AndriiKaraivanskyi,除非删除失败,否则它会成功。 - muru
rm -rf会递归删除目录,然后find可能尝试浏览已删除的文件夹(显示错误)。此外,我不确定OP是否想要删除.orig目录,这些目录很可能包含非.orig的文件... - Déjà vu
我注册了这个网站,只是为了能够给这个答案点赞。被接受的答案没有起作用,但这个对我有帮助。谢谢您,亲切的先生。 - Felipe Centeno

我已经删除了所有以.nfs000000000开头的文件,就像这样。
rm .nfs000000000*

以下是我通常会做的事情。
find ./ -name "*.orig" | xargs rm -r

先通过检查 xargs 来查看您将要删除的文件,这是一个好主意。以下内容将打印出您找到的文件。

find ./ -name "*.orig" | xargs

如果你注意到一个被找到的文件,而你又不想删除它,可以调整你最初的find命令或者添加一个grep -v步骤来排除匹配项。
find ./ -name "*.orig" | grep -v "somefiletokeep.orig" | xargs rm -r

首先,将所有找到的文件列出来是明智之举,同时也是筛选出任何异常情况的好方法。 - talentcat