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