3种方式删除目录中的所有文件,除了一个或少量带扩展名的文件

在本文中,我们将向您展示如何使用rm,find和globignore命令删除目录中除了某些文件扩展名或类型之外的文件。

有时,你会遇到一种情况,你需要删除目录中的所有文件或只是清除目录,删除所有文件,除了给定类型的文件(以特定的扩展名结束)。 在本文中,我们将告诉你如何在目录中删除文件,除了某些文件扩展名或使用RM类型, 找到GLOBIGNORE命令。 在我们进一步移动之前,让我们从简单地看一看Linux中的一个重要概念 - 文件名模式匹配,这将使我们能够处理我们的问题。

建议阅读: 使用find命令来搜索Linux的多个文件名/扩展

在Linux中,一个shell模式是由下列特殊字符,它被称为通配符元字符的字符串:
  1. * -零个或多个字符匹配
  2. ? -匹配任何单个字符
  3. [seq] -序列中的任何字符相匹配
  4. [!seq] -匹配任何字符不是以次
我们将在这里探讨三种可能的方法,包括:

使用扩展模式匹配操作符删除文件

的不同的扩展的模式匹配运算符如下,其中图案列表是包含一个或多个文件名的列表中列出,使用分离|字符:
  1. *(pattern-list) -零个或多个指定的模式相匹配
  2. ?(pattern-list) -匹配零次或一次指定模式
  3. +(模式列表) -匹配指定模式的一次或多次出现
  4. @(pattern-list) -匹配指定的模式之一
  5. !(pattern-list) -匹配任何东西,除了给定的模式之一
要使用它们,如下启用extglob shell选项:
# shopt -s extglob
1.要删除所有文件,除了文件名的目录中,键入以下命令:
$ rm -v !("filename")
在Linux中删除除一个文件之外的所有文件

在Linux中删除除一个文件之外的所有文件

2.要删除与文件名1文件名2以外的所有文件:
$ rm -v !("filename1"|"filename2") 
除了Linux中的少量文件之外,删除所有文件

除了Linux中的少量文件之外,删除所有文件

3.下面的例子说明如何删除比所有其他所有文件.zip交互文件:
$ rm -i !(*.zip)
删除除Linux中的Zip文件之外的所有文件

删除除Linux中的Zip文件之外的所有文件

4.接下来,你可以在一个目录中的所有删除所有文件除了.zip.odt文件如下,同时显示正在做什么:
$ rm -v !(*.zip|*.odt)
删除除某些文件扩展名之外的所有文件

删除除某些文件扩展名之外的所有文件

一旦你拥有所有必需的命令,关闭,像这样的extglob外壳选项:
$ shopt -u extglob

使用Linux find命令删除文件

根据这种方法,我们可以使用find命令只用适当的选项,或者与通过采用流水线如下形式xargs的命令结合:
$ find /directory/ -type f -not -name 'PATTERN' -delete
$ find /directory/ -type f -not -name 'PATTERN' -print0 | xargs -0 -I {} rm {}
$ find /directory/ -type f -not -name 'PATTERN' -print0 | xargs -0 -I {} rm [options] {}
5.以下命令将从除了删除所有文件.gz在当前目录下的文件:
$ find . -type f -not -name '*.gz'-delete
命令查找 - 删除除了.gz文件之外的所有文件

命令查找 - 删除除了.gz文件之外的所有文件

6.使用管道xargs的 ,您对上述修改如下情况:
$ find . -type f -not -name '*gz' -print0 | xargs -0  -I {} rm -v {}
使用find和xargs命令删除文件

使用find和xargs命令删除文件

7.让我们看一个额外的例子,下面的命令将消灭排除所有文件.gz.odt.jpg在当前目录下的文件:
$ find . -type f -not \(-name '*gz' -or -name '*odt' -or -name '*.jpg' \) -delete
除文件扩展名外,删除所有文件

除文件扩展名外,删除所有文件

使用Bash GLOBIGNORE变量删除文件

然而,最后一种方法,只适用于bash。在这里,GLOBIGNORE变量存储一个冒号分隔的模式列表(文件名)由路径扩展被忽略。

建议阅读: 有用12实际的例子在grep命令在Linux中

采用这种方法,移动到您要清理的目录,然后设置GLOBIGNORE变量,如下所示:
$ cd test
$ GLOBIGNORE=*.odt:*.iso:*.txt
在这种情况下,比其他所有的文件.odt.iso.txt文件与从当前目录中删除。 现在运行命令清理目录:
$ rm -v *
此后,关闭GLOBIGNORE变量:
$ unset GLOBIGNORE
使用Bash GLOBIGNORE变量删除文件

使用Bash GLOBIGNORE变量删除文件

注意 :要了解上面的命令所使用的标志的含义,请参见我们在各种插图中使用的每个命令的手册页。 就这样!如果您有任何其他命令行技术为同一目的,不要忘记通过我们的反馈部分与我们分享以下。