网站搜索

删除目录中除一个或少数带扩展名的文件之外的所有文件的 3 种方法


有时您会遇到这样的情况:需要删除目录中的所有文件,或者通过删除除给定类型的文件(以特定扩展名结尾)之外的所有文件来简单地清理目录。

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

在我们进一步讨论之前,让我们首先简要了解一下 Linux 中的一个重要概念——文件名模式匹配,这将使我们能够处理手头的问题。

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

在 Linux 中,shell 模式是由以下特殊字符组成的字符串,这些特殊字符称为通配符元字符

  1. * – 匹配零个或多个字符
  2. ? – 匹配任何单个字符
  3. [seq] – 匹配 seq 中的任何字符
  4. [!seq] – 匹配不在 seq 中的任何字符

我们将在这里探讨三种可能的方法,其中包括:

使用扩展模式匹配运算符删除文件

下面列出了不同的扩展模式匹配运算符,其中 pattern-list 是包含一个或多个文件名的列表,使用 | 字符分隔:

  1. *(pattern-list) – 匹配指定模式的零次或多次出现
  2. ?(pattern-list) – 匹配指定模式的零次或一次出现
  3. +(pattern-list) – 匹配指定模式的一次或多次出现
  4. @(pattern-list) – 匹配指定模式之一
  5. !(pattern-list) – 匹配除给定模式之一之外的任何内容

要使用它们,请启用 extglob shell 选项,如下所示:

shopt -s extglob

1. 要删除目录中除 filename 之外的所有文件,请键入以下命令:

rm -v !("filename")

2. 要删除除 filename1filename2 之外的所有文件:

rm -v !("filename1"|"filename2") 

3. 下面的示例展示了如何以交互方式删除除所有 .zip 文件之外的所有文件:

rm -i !(*.zip)

4. 接下来,您可以删除目录中除所有 .zip.odt 文件之外的所有文件,如下所示,同时显示正在删除的内容完毕:

rm -v !(*.zip|*.odt)

获得所有必需的命令后,关闭 extglob shell 选项,如下所示:

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

6. 使用管道xargs,您可以按如下方式修改上面的情况:

find . -type f -not -name '*gz' -print0 | xargs -0  -I {} rm -v {}

7. 让我们再看一个例子,下面的命令将清除除 .gz.odt 之外的所有文件当前目录下的.jpg文件:

find . -type f -not \(-name '*gz' -or -name '*odt' -or -name '*.jpg' \) -delete

使用 Bash GLOBIGNORE 变量删除文件

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

建议阅读: Linux 中 Grep 命令的 12 个实用示例

要使用此方法,请移至要清理的目录,然后按如下所示设置 GLOBIGNORE 变量:

cd test
GLOBIGNORE=*.odt:*.iso:*.txt

在这种情况下,除了 .odt.iso.txt 文件之外的所有文件都将从当前目录中删除。

现在运行命令来清理目录:

rm -v *

然后,关闭 GLOBIGNORE 变量:

unset GLOBIGNORE

注意:要了解上述命令中使用的标志的含义,请参阅我们在各种插图中使用的每个命令的手册页。

就这样!如果您有任何其他用于相同目的的命令行技术,请不要忘记通过下面的反馈部分与我们分享。