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

use*_*847 97 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
Run Code Online (Sandbox Code Playgroud)

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

rm -rf abc.log.2012-03-14 
rm -rf abc.log.2012-03-27
rm -rf abc.log.2012-03-28
Run Code Online (Sandbox Code Playgroud)

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

unw*_*ind 151

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

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

$ rm -rf abc.log.2012-03-{14,27,28}
Run Code Online (Sandbox Code Playgroud)

以上将扩展为包含所有三个参数的单个命令,并且等同于键入:

$ rm -rf abc.log.2012-03-14 abc.log.2012-03-27 abc.log.2012-03-28
Run Code Online (Sandbox Code Playgroud)

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


dog*_*ane 72

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

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

rm -f abc.log.2012-03-*
Run Code Online (Sandbox Code Playgroud)

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

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

  • @nuriselcuk,您可以添加 -i 以获得每个被删除文件的确认。 (2认同)

Kei*_*son 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
Run Code Online (Sandbox Code Playgroud)

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

$ rm -f $(ls | grep -i '^abc\.log\.')
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

$ rm -f `ls | grep -i '^abc\.log\.'`
Run Code Online (Sandbox Code Playgroud)

$(...)语法更容易阅读,如果你真的雄心勃勃它可以被嵌套.

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

$ ls > list
$ vi list   # Use your favorite text editor
Run Code Online (Sandbox Code Playgroud)

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

$ rm -f $(<list)
Run Code Online (Sandbox Code Playgroud)

要么

$ rm -f `cat list`
Run Code Online (Sandbox Code Playgroud)

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

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

$ . ./list
Run Code Online (Sandbox Code Playgroud)

要么

$ source ./list
Run Code Online (Sandbox Code Playgroud)


And*_*ndy 8

只需在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
Run Code Online (Sandbox Code Playgroud)


lac*_*991 5

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

rm -rf abc.log.2012-*
Run Code Online (Sandbox Code Playgroud)

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