如何递归删除当前目录中特定扩展名的所有文件?

如何使用一个命令行安全地从当前目录和所有子文件夹中删除具有特定扩展名(例如.bak )的所有文件? 简单地说,我害怕使用rm因为我曾经使用过一次错误,现在我需要建议。

如果你害怕,你甚至不需要在这种情况下使用rm 。 使用find

 find . -name "*.bak" -type f -delete 

但要谨慎使用它。 先跑:

 find . -name "*.bak" -type f 

准确查看要删除的文件。

另外,请确保-delete命令中的最后一个参数 。 如果你把它放在-name *.bak argument它将删除所有内容

有关更多信息,请参阅man findman rm ,另请参阅SE上的相关问题:

  • 如何从项目中删除所有.pyc文件?
 find . -name "*.bak" -type f -print0 | xargs -0 /bin/rm -f 

首先运行命令shopt -s globstar 。 您可以在命令行上运行它,它只会在该shell窗口中生效。 你可以把它放在你的.bashrc ,然后所有新启动的shell都会把它拿起来。 该命令的作用是递归地在当前目录及其子目录中生成**/匹配文件(默认情况下, **/表示与*/ :仅在立即子目录中相同)。 然后:

 rm **/*.bak 

(或gvfs-trash **/*.bak或你有什么)。

删除文件对我来说不是你应该使用rm东西。 这是一个替代方案:

 sudo apt-get install gvfs # install a tool that allows you to put stuff in the trash alias "trash"="gvfs-trash" # you can also put this in .bash_aliases or simply use the command without alias trash *.bak # trash the files (thus moving them to the trash bin) 

正如弗利姆在评论中所述:

trash-cligvfs-trash完全相同,不依赖于gvfs。

所以:

 sudo apt-get install trash-cli 

您不需要为此创建别名,因为trash-cli包提供了一个命令trash ,它可以满足我们的需求。

正如Eliah Kagan在广泛的评论中明确指出的那样,你也可以使用find来进行递归。 在这种情况下,您不能使用别名,因此以下命令假定您已安装trash-cli 。 我总结了以利亚的评论:

此命令在当前目录或其子目录或其下的任何位置查找并显示所有.bak文件和符号链接。

 find . -name '*.bak' -xtype f 

要删除它们,请使用trash命令附加-exec

 find . -name '*.bak' -xtype f -exec trash {} + 

-xtype f选择文件和符号链接到文件,但不选择文件夹。 要删除.bak文件夹,请删除该部分,并使用-execdir ,这样可以避免在.bak目录中删除.bak文件中cannot trash non-existent错误:

 find . -name '*.bak' -execdir trash {} + 

如果要删除某个类型的所有文件,但只删除当前文件夹中“1”的文件夹:

 find . -maxdepth 2 -name "*.log" -type f -delete 

-maxdepth 2因为当前目录“ ”计为第一个文件夹。

如果你在git仓库里面,你可以使用:

 git clean -fdx 

这将删除.gitignore中未跟踪的文件和文件。