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

我有这个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 

有没有另一种方法,以便我可以一次删除选定的文件?

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

您的确切情况将通过大括号扩展来处理,如下所示:

 $ 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完成的。

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

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

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

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

有关更多详细信息,请参阅文件名扩展的Bash手册页。

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

 $ 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 

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

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

当我这样做时,我运行ls | grep ... ls | grep ...命令,并检查它是否产生我想要的输出 – 特别是如果我使用rm -f

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

哪里!! 扩展到以前的命令。 或者,我可以input向上箭头或Ctrl-P,然后编辑上一行以添加rm -f命令。

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

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

$(...)语法更容易阅读,如果您雄心勃勃,可以嵌套。

最后,如果要删除的文件的子集不能用正则expression式轻松expression,我经常使用的一个技巧就是将这些文件列出到一个临时文本文件中,然后对其进行编辑:

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

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

 $ rm -f $(<list) 

要么

 $ rm -f `cat list` 

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

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

 $ . ./list 

要么

 $ source ./list 

通配符可以很好地工作,尽pipe为了安全起见,最好尽可能less地使用通配符,所以有如下几点:

 rm -rf abc.log.2012-* 

虽然从外观上看,那些只是单个文件? 如果这些项目都不是目录,recursion选项不应该是必需的,所以最好不要使用它,只是为了安全。

只需在sublime中使用多行select,将所有文件合并成一行,然后在每个文件名之间添加一个空格,然后在列表的开头添加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 

我不是一个Linux大师,但我相信你想输出文件的列表xargs rm -rf 。 以前我用过这样的东西,效果很好。 先testing一个示例目录!

编辑 – 我可能会误解,根据出现的其他答案。 如果你可以使用通配符,太棒了。 我假定你所显示的原始列表是由一个程序生成的,以便给你“select”,所以我认为用xargs来pipe道是最好的select。

如果您想一次删除属于目录的所有文件。 例如; 你的目录名是“log”,“log”目录包括abc.log.2012-03-14,abc.log.2012-03-15等…..文件。 你必须在日志目录之上

rm -rf / log / *