如何在Linux上的Bash中一次删除多个文件?

时间:2012-05-09 12:44:33

标签: linux bash rm

我在Linux服务器中有这个文件列表:

abc.log.2012-03-14
abc.log.2012-03-27
abc.log.2012-03-28
abc.log.2012-03-29
abc.log.2012-03-30
abc.log.2012-04-02
abc.log.2012-04-04
abc.log.2012-04-05
abc.log.2012-04-09
abc.log.2012-04-10

我一直在使用rm -rf命令逐个删除选定的日志文件,如下所示:

rm -rf abc.log.2012-03-14 
rm -rf abc.log.2012-03-27
rm -rf abc.log.2012-03-28

还有其他方法,以便我可以一次删除所选文件吗?

7 个答案:

答案 0 :(得分:142)

Bash支持各种通配符和扩展。

您的确切案例将由brace expansion处理,如下所示:

$ rm -rf abc.log.2012-03-{14,27,28}

以上将扩展为一个包含所有三个参数的命令,相当于输入:

$ rm -rf abc.log.2012-03-14 abc.log.2012-03-27 abc.log.2012-03-28

重要的是要注意,在rm被加载之前,这个扩展是由shell完成的。

答案 1 :(得分:71)

使用通配符(*)匹配多个文件。

例如,以下命令将删除名称以abc.log.2012-03-开头的所有文件。

rm -f abc.log.2012-03-*

我建议运行ls abc.log.2012-03-*列出文件,以便在运行rm命令之前可以看到要删除的内容。

有关详细信息,请参阅filename expansion上的Bash手册页。

答案 2 :(得分:36)

如果要删除名称与特定表单匹配的所有文件,则通配符(glob模式)是最直接的解决方案。一些例子:

$ rm -f abc.log.*             # Remove them all
$ rm -f abc.log.2012*         # Remove all logs from 2012
$ rm -f abc.log.2012-0[123]*  # Remove all files from the first quarter of 2012

正则表达式比通配符更强大;您可以将grep的输出提供给rm -f。例如,如果某些文件名以"abc.log"开头,而某些文件名以"ABC.log"开头,则grep可让您执行不区分大小写的匹配:

$ rm -f $(ls | grep -i '^abc\.log\.')

当我这样做时,我首先运行ls | grep ...命令并检查它是否产生我想要的输出 - 尤其是如果我正在使用rm -f

$ ls | grep -i '^abc\.log\.'
(check that the list is correct)
$ rm -f $(!!)

其中!!扩展为上一个命令。或者我可以键入向上箭头或Ctrl-P并编辑上一行以添加rm -f命令。

这假设您正在使用bash shell。其他一些shell,特别是csh和tcsh以及一些较旧的sh派生shell,可能不支持$(...)语法。您可以使用等效的反引号语法:

$ rm -f `ls | grep -i '^abc\.log\.'`

$(...)语法更容易阅读,如果你真的有野心,它可以嵌套。

最后,如果您要删除的文件子集不能用正则表达式轻松表达,我经常使用的技巧是将文件列为临时文本文件,然后进行编辑:

$ ls > list
$ vi list   # Use your favorite text editor

然后我可以手动编辑list文件,只保留我要删除的文件,然后:

$ rm -f $(<list)

$ rm -f `cat list`

(这假设没有文件名包含有趣的字符,特别是空格。)

或者,在编辑list文件时,我可以将rm -f添加到每行的开头,然后:

$ . ./list

$ source ./list

答案 3 :(得分:7)

只需在sublime中使用多行选择将所有文件合并为一行,并在每个文件名之间添加一个空格,然后在列表的开头添加rm。当您要删除的文件名中没有模式时,这非常有用。

[$]> rm abc.log.2012-03-14 abc.log.2012-03-27 abc.log.2012-03-28 abc.log.2012-03-29 abc.log.2012-03-30 abc.log.2012-04-02 abc.log.2012-04-04 abc.log.2012-04-05 abc.log.2012-04-09 abc.log.2012-04-10

答案 4 :(得分:5)

外卡可以很好地用于此,虽然为了安全起见,最好尽可能减少使用外卡,所以有类似的内容:

rm -rf abc.log.2012-*

虽然从它的外观来看,那些只是单个文件吗?如果这些项目都不是目录,则不需要递归选项,因此最好不要使用它,只是为了安全。

答案 5 :(得分:2)

我不是linux大师,但我相信您想将输出文件列表输出到xargs rm -rf。我过去曾经使用过这样的东西,效果很好。首先在示例目录上进行测试!

编辑 - 基于出现的其他答案,我可能误解了。如果你可以使用通配符,那很好。我假设您显示的原始列表是由程序生成的,以便为您提供“选择”,因此我认为可以选择管道xargs

答案 6 :(得分:-1)

如果要一次删除属于目录的所有文件。例如;目录名称是&#34; log&#34;和&#34; log&#34;目录包括abc.log.2012-03-14,abc.log.2012-03-15,..... ect文件。您必须位于日志目录和

之上

rm -rf / log / *