如何在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 / *