如果要删除名称与特定格式匹配的所有文件,则通配符(全局模式)是最简单的解决方案。一些例子:
$ 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
编辑文件也是在必要时添加引号的机会,例如更改rm -f foo bar
为rm -f 'foo bar'
。