如果要删除名称与特定形式匹配的所有文件,通配符(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 $(!!)
where!!
扩展为上一个命令。或者我可以键入向上箭头或 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
编辑文件也是在必要时添加引号的机会,例如更改rm -f foo bar
为rm -f 'foo bar'
.