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

评论

相关文章-如何使用通配符递归删除目录?

#1 楼

如果您担心的话,甚至不需要使用rm。使用find

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


,但要谨慎使用。首先运行:

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


以确切查看要删除的文件。

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

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


如何如何从项目中删除所有.pyc文件?


评论


与rm * .bak有什么不同?

–sayantankhan
13年15月15日在13:11

@ Bolt64您的rm * .bak不适用于子目录。

– RaduRădeanu
2013年11月15日13:14



使用默认设置rm * .bak将仅删除当前目录中所有以.bak结尾的文件。要在子目录中执行某些操作,您可能需要弄乱glob,使用-r选项或使用find示例。

–亨尼斯
13年15月15日在13:14

@Hennes请注意rm -r * .bak!它还会删除所有以.bak结尾的目录及其所有内容。

– RaduRădeanu
13年11月15日13:34



确保-delete是命令中的最后一个参数。如果将其放在-name * .bak参数之前,它将删除所有内容。

–迈克尔
2014-10-29 14:36

#2 楼

find . -name "*.bak" -type f -print0 | xargs -0 /bin/rm -f


评论


欢迎来到askubuntu!虽然这是一个非常有效的答案,但我认为使用它代替find的-delete标志没有任何好处。可以在GNU手册条目中找到更多信息,以使用find删除文件。

–谷氨酸
2014年4月4日20:11在

您可能是对的,这只是替代解决方案,也许更原始;)

–旅行者
2014年4月4日在22:13

这不仅是一个替代方案,而且是一个示例如何将其他命令与管道“ |”组合在一起的示例。 +1

–鲍里斯·帕夫洛维奇(BorisPavlović)
2014年6月5日7:18

此替代解决方案可用于其他缺少-delete的环境(例如cygwin)

– ciriarte
2014年8月15日下午4:07

我认为这是最好的答案。

–LéoLéopoldHertz준영
15年6月29日在11:27

#3 楼

首先运行命令shopt -s globstar。您可以在命令行上运行该命令,它仅在该shell窗口中有效。您可以将其放在.bashrc中,然后所有新启动的Shell都会将其拾取。该命令的作用是递归地使**/与当前目录及其子目录中的文件匹配(默认情况下,**/*/含义相同:仅在直接子目录中)。然后:

rm **/*.bak


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

评论


谢谢作品👍️🙏️❤️

–ARIF MAHMUD RANA
19/12/5在15:54

#4 楼

对我来说,删除文件不是您应该使用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在评论中指出的那样:


软件包trash-cligvfs-trash具有相同的功能无需依赖gvfs。


因此:

sudo apt-get install trash-cli


您无需为此设置别名,因为trash-cli软件包提供了一个命令trash可以满足我们的需求。

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

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

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


要删除它们,请在-exec命令后附加一个trash

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


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

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


评论


“不要使用rm删除事物”是一个有争议的说法,但我必须同意,使用可以让您撤消事物的事物通常更明智。

–奥利♦
13年15月15日在15:12

不依赖于gvfs的情况下,rash-cli软件包的功能与gvfs-trash相同。

– Flimm
13年11月20日在9:08

我已经在答案中对其进行了编辑,下次您可以自己进行编辑。

– don.joey
13年11月20日在10:06

@ don.joey这个答案似乎说find。 -name“ * .bak” -type f显示* .bak删除的垃圾。那真的是你的意思吗?您可以使用垃圾桶或gvfs-trash将目录移动到垃圾桶,但是垃圾桶* .bak仅会移动名称以.bak结尾并且立即位于当前目录中的文件和目录。外壳程序会扩展* .bak,因此,垃圾箱* .bak不会影响子目录(其自身名为.bak)中的.bak文件。

– Eliah Kagan
17-10-14在2:30



@ don.joey是ls * .bak(我想您的意思是)列出了什么垃圾* .bak垃圾。找 。 -name'* .bak'-xtype f -exec垃圾{} +将所有.bak文件丢弃在..下的任何位置。它不能使用别名,因此请安装垃圾桶cli或编写gvfs-trash。这是一个例子。 -xtype f选择文件和文件的符号链接,但不选择文件夹。要也删除.bak文件夹,请使用find。 -name'* .bak'-execdir垃圾{} +,可避免无法为.bak目录中的.bak文件垃圾不存在的错误。请随时在您的答案中使用任何一个。

– Eliah Kagan
17-10-14在19:15

#5 楼

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

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

#6 楼

快速解答:



递归删除所有具有所考虑名称或后缀的文件:

find . -name '*.pyc' -type f -delete


>以递归方式删除所有具有所考虑名称的目录:

find ~ -path '*/__pycache__/*' -delete‍‍‍
find ~ -type d -name '__pycache__' -empty -delete‍‍‍


有些不太严格的控制,但在一行中:

find ~ -path '*/__pycache__*' -delete




[注意]:

d是目录选项,f是文件选项。

#7 楼

如果要在删除文件之前检查列表,可以回显它。

find . -name "*.bak" -type f | xargs echo rm -rf


这将列出通过rm命令传递的搜索结果通过xargs。
一旦确定列表,就可以在上面的命令中放置echo。

find . -name "*.bak" -type f | xargs rm -rf


评论


添加-print0是一个好习惯| xargs -0处理角文件名,示例测试为您提供xargs:不匹配的单引号;缺省情况下,除非您使用-0选项,否则xargs的引号是特殊的,否则带换行符的文件名将中断。

–bac0n
19-11-25在7:02