问题描述
如何从当前目录和所有使用一个命令行的子文件夹安全地删除具有特定扩展名的所有文件(例如.bak
)?简单地说,我害怕使用rm
,因为我曾经错误地使用过它,现在我需要建议。
最佳解决思路
如果你害怕,你甚至不需要在这种情况下使用rm
。使用find
:
find . -name "*.bak" -type f -delete
但谨慎使用它。先运行:
find . -name "*.bak" -type f
准确查看您将删除哪些文件。
另外,确保-delete
是您的命令中的最后一个参数。如果你把它放在-name *.bak argument
之前,它会删除所有内容。
有关更多信息,请参见man find
和man 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 asgvfs-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 {} +