可能的重复:
删除文件夹中除文件 X、Y 和 Z 之外的所有文件
我正在编写一个脚本来编译许多.tex
文件。之后,创建了许多辅助文件。
因此,我想在脚本末尾删除它们。我很难使用rm $file.xxx
,但我必须手动编写所有扩展名,因为我想保留我的源文件和pdf输出,所以我不能使用*来删除所有扩展名。
如何删除除扩展名之外的所有扩展名.tex/.pdf
?
谢谢。
答案1
您可以使用:
rm *.{extension1,extension2,extension3}
或者你也可以使用:
shopt -s extglob
rm !(*.tex|*.pdf)
这将删除除您想要保留的文件之外的所有文件,在本例中为 *.tex 和 *.pdf。
答案2
好吧,您可以忽略这些rm
错误,但这并不优雅:)。
将这样的函数添加到您的 ~/.bashrc 中:
function cleantex () {
find . -name "$1*" | grep -vP '.tex$|.pdf$' | while read -r i; do rm "$i"; done
}
然后,您可以使用文件名的(唯一)开头来调用它,如下所示:
$ cleantex mytexfile
它将删除给定目录中以$file
或 开头且不以.tex
或结尾的所有文件.pdf
。确保$
匹配仅在文件末尾(扩展名)。否则它将忽略像这样的文件,footexfoo.aux
因为文件名包含tex
.您可以根据需要添加任意多个要忽略的扩展:
function cleantex () {
find . -name "$1*" | grep -vP '.tex$|.pdf$|.foo$|.bar$' | while read -r i; do rm "$i"; done
}
如果您想从 bash 脚本中删除这些文件,则实际上并不需要该函数。只需将此行添加到您的脚本中(更改mytexfile
为您的 tex 文件的名称):
find . -name "mytexfile*" | grep -vP '.tex$|.pdf$' | while read -r i; do rm "$i"; done
最后,如果您希望能够对所有 tex 文件执行此操作,无论其名称如何,请使用:
find . -name "*.tex" | sed 's/\.tex$//' | while read -r name; do
find . -name "$name"* | grep -vP '.tex$|.pdf$' | while read -r i;
do
rm "$i";
done;
done