![通过正则表达式删除具有特定扩展名的文件](https://linux22.com/image/1063173/%E9%80%9A%E8%BF%87%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%88%A0%E9%99%A4%E5%85%B7%E6%9C%89%E7%89%B9%E5%AE%9A%E6%89%A9%E5%B1%95%E5%90%8D%E7%9A%84%E6%96%87%E4%BB%B6.png)
我有用于编译 LaTeX *.tex 文件的 Makefile (tex->dvi->ps->pdf)。然后我有用于删除不必要的临时文件 (dvi、ps...) 的命令 clean,如下所示:
rm `ls | grep "^${FILENAME}\.(aux|dvi|ps|log)"`
但它甚至删除了我需要保留的 *.pdf 文件。如果我回显我发现的结果ls | grep
,它会获取所有文件,其扩展名以正则表达式中扩展名的首字母开头,因此
echo `ls | grep "^${FILENAME}\.[aux|dvi|ps|log]"`
#echoes proj.aux proj.dvi proj.log proj.pdf proj.ps
其他文件保持不变(*.tex)
我如何仅选择具有正则表达式扩展名的文件(而不是 *.pdf)?提前致谢。
答案1
在命令行上,你应该使用 shell glob,而不是尝试使用正则表达式匹配 的输出ls
。例如,在 bash 中,你可以使用括号扩展
rm "$FILENAME".{aux,dvi,log,ps}
或(如果启用了扩展通配符)
rm "$FILENAME".!(tex|pdf)
在 Makefile 中,您可能应该使用make
命令自己的文本转换函数 - 例如,在 GNU make 的情况下,您可以使用addprefix
例如
FILENAME = foo
.PHONY: clean
clean:
@echo rm $(addprefix $(FILENAME),.aux .dvi .log .ps)
给予
$ make clean
rm foo.aux foo.dvi foo.log foo.ps
答案2
首先,不要使用 ls,而要使用 find。但无论如何,这是你在grep 手册页:
Matcher Selection
-E, --extended-regexp
Interpret PATTERN as an extended regular expression (ERE, see
below).
因此使用如下方法:
echo `find . | grep -E "^${FILENAME}\.(aux|dvi|ps|log)"`
答案3
此表达式有效:ls | grep -E ".(aux|dvi|ps|log)"
。您没有使用 -E 标志,该标志允许 grep 使用扩展正则表达式(即允许 | 被解释为或运算符)。注意:您也可以这样做ls | grep -E ".aux|dvi|ps|log"
并获得所需的结果。