我在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手册页.
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)
只需在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)
一张外卡可以很好地用于此,虽然为了安全起见,最好尽可能减少外卡的使用,所以有类似的话:
rm -rf abc.log.2012-*
Run Code Online (Sandbox Code Playgroud)
虽然从它的外观来看,那些只是单个文件?如果这些项目都不是目录,则不需要递归选项,因此最好不要使用它,只是为了安全起见.
| 归档时间: |
|
| 查看次数: |
256867 次 |
| 最近记录: |