通过正则表达式删除具有特定扩展名的文件

通过正则表达式删除具有特定扩展名的文件

我有用于编译 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

GNU make:字符串替换和分析函数

答案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"并获得所需的结果。

相关内容