删除除一种类型之外的许多文件

删除除一种类型之外的许多文件

可能的重复:
删除文件夹中除文件 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

相关内容