我在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
还有其他方法,以便我可以一次删除所选文件吗?
答案 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 / *