使用rm递归删除文件和目录


17

是否可以使用rm递归删除与模式匹配的文件和目录,而无需使用其他命令?

Answers:


35

要直接回答您的问题,“不-您不能做您所描述的rm”。

但是,您可以将其与结合使用find。这是您可以执行此操作的多种方法之一:

 # search for everything in this tree, search for the file pattern, pipe to rm
 find . | grep <pattern> | xargs rm

例如,如果要核对所有*〜文件,可以这样:

 # the $ anchors the grep search to the last character on the line
 find . -type f | grep '~'$ | xargs rm

从评论扩展*

 # this will handle spaces of funky characters in file names
 find -type f -name '*~' -print0 | xargs -0 rm

1
是的-如果您省去了最后一个管道,则将首先获得所有列表:)
沃伦(Warren)在2009年

2
可能不会直接回答发布者的问题,但是会最接近他们想要的东西。
德雷基亚

1
矮人,不是无缘无故有点苦吗?
Gnoupi

10
请非常小心地使用find | grep | xargs rm。如果文件中带有空格(或换行符),则该文件将中断(并取决于文件名和空格所在),可能会删除您不打算删除的内容。find … -print0 | xargs -0 rm将会更加强大。但是,这意味着您不能使用,grep而必须使用find的谓词来匹配和仅打印所需的文件。沃伦的第二个例子将更强大find -type f -name '*~' -print0 | xargs -0 rm
克里斯·约翰森

1
如果您希望使用单个命令来完成这项工作,请使用给定的find命令之一来创建别名。如果需要,稍后将填写答案。
Casualuser

8

“不使用其他命令”

没有。


不错的答案,说明了“严格回答最初的问题(冒着无法提供解决方案的风险)”与“提供解决方案,即使它与严格限制的要求不完全匹配”的辩论。
Gnoupi

我仅将其发布为“小矮人”正在抱怨实际上提供了解决方案的答案。如果不使用其他命令,实际上就无法进行与模式匹配的递归文件删除,仅是当前目录文件/目录删除。
09年

3

使用Bash,并globstar设置为yes

rm basedir/**/my*pattern*

例如,ls -1首先尝试,然后rm列出您要匹配的文件。

您可以通过例如设置选项shopt -s globstar


或者,一个较短的find变体:

find -type f -name 'my*pattern*' -delete

或对于GNU find

find -type f -name 'my*pattern*' -exec rm {} +

或非GNU的另一种选择find(慢一点):

find -type f -name 'my*pattern*' -exec rm {} \;

也删除目录,你问:只是改变rmrm -r在上面的命令,并跳过只匹配-type ffind命令。


0

我应该将“ rm -rf”设置为文件名和*和?之类的匹配模式的组合。等等(例如todays_log_2009 ????。log)。从当前的Dir开始,然后递归地删除破坏该模式的文件。


这将不起作用,因为该模式由外壳程序在当前目录中扩展。如果加引号,则该模式将成为带有特殊字符的文件名。例如删除文件[,可以写rm'['。模式只是失去了意义。
Casualuser

0

如果使用zsh(1),请setopt extendedglob在.zshrc中启用“扩展的globing” 。使用'** /'前缀的模式将递归删除:

%rm -rf ** / <模式>

但是,如果要删除的文件很多,则应使用xargs(1)或-exec 来执行find(1),我也建议在Shell脚本中执行此操作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.