删除目录中除一个或少数带扩展名的文件之外的所有文件的 3 种方法
有时您会遇到这样的情况:需要删除目录中的所有文件,或者通过删除除给定类型的文件(以特定扩展名结尾)之外的所有文件来简单地清理目录。
在本文中,我们将向您展示如何使用 rm、find 和 globignore 命令删除目录中除某些文件扩展名或类型之外的文件。
在我们进一步讨论之前,让我们首先简要了解一下 Linux 中的一个重要概念——文件名模式匹配,这将使我们能够处理手头的问题。
建议阅读: 使用 find 命令在 Linux 中搜索多个文件名/扩展名
在 Linux 中,shell 模式是由以下特殊字符组成的字符串,这些特殊字符称为通配符或元字符:
*
– 匹配零个或多个字符?
– 匹配任何单个字符[seq]
– 匹配 seq 中的任何字符[!seq]
– 匹配不在 seq 中的任何字符
我们将在这里探讨三种可能的方法,其中包括:
使用扩展模式匹配运算符删除文件
下面列出了不同的扩展模式匹配运算符,其中 pattern-list 是包含一个或多个文件名的列表,使用 |
字符分隔:
*(pattern-list)
– 匹配指定模式的零次或多次出现?(pattern-list)
– 匹配指定模式的零次或一次出现- +(pattern-list) – 匹配指定模式的一次或多次出现
@(pattern-list)
– 匹配指定模式之一!(pattern-list)
– 匹配除给定模式之一之外的任何内容
要使用它们,请启用 extglob shell 选项,如下所示:
shopt -s extglob
1. 要删除目录中除 filename 之外的所有文件,请键入以下命令:
rm -v !("filename")
2. 要删除除 filename1 和 filename2 之外的所有文件:
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
注意:要了解上述命令中使用的标志的含义,请参阅我们在各种插图中使用的每个命令的手册页。
就这样!如果您有任何其他用于相同目的的命令行技术,请不要忘记通过下面的反馈部分与我们分享。