当前位置: 首页>>技术教程>>正文


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

, , , ,

问题描述

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

最佳解决思路

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

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

但谨慎使用它。先运行:

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

准确查看您将删除哪些文件。

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

有关更多信息,请参见man findman rm以及SE上的相关问题:

次佳解决思路

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)

正如Flimm在评论中所述:

The package trash-cli does the same thing as gvfs-trash without the dependency on gvfs.

所以:

sudo apt-get install trash-cli

您不需要为此创建别名,因为trash-cli程序包提供了命令trash,该命令完成我们所需的操作。

正如Eliah Kagan在广泛的评论中表明的那样,您也可以使用find进行递归。在这种情况下,你不能使用别名,所以下面的命令假设你已经安装了trash-cli。我总结了Eliah的评论:

此命令查找并显示当前目录或其子目录或下面任何位置的所有.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 {} +

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/62.html,未经允许,请勿转载。