有时候,你可能会遇到这种情况,你需要删除目录中的所有文件,或者只是简单地删除目录中除某些类型以外的文件指定的类型(以指定的扩展名结尾)。在本文中,我们将向您展示如何通过rm、find和globignore命令删除目录中指定文件扩展名或类型以外的文件。在继续深入之前,让我们先简要了解一下Linux中的一个重要概念——文件名模式匹配,它可以帮助我们解决手头的问题。在Linux下,shell模式是一个包含以下特殊字符的字符串,称为通配符或元字符:*–匹配零个或多个字符?–匹配任何单个字符[sequence]–匹配序列中的任何一个字符[!Sequence]–匹配不在序列中的任何字符我们将在这里探讨三种可能的方法,包括:使用扩展模式匹配运算符删除文件下面列出了模式匹配运算符,模式列表是一个或多个由|分隔的文件名的列表:*(pattern-list)–匹配指定模式的0次或多次出现?(pattern-list)–匹配指定模式的0次或1次出现@(pattern-list)–匹配指定模式的1次或多次出现!(pattern-list)–匹配指定模式以外的任何模式要使用它们,您需要像这样打开extglobshell选项:#shopt-sextglob1。输入以下命令,删除一个目录下除文件名以外的所有文件$rm-v!("文件名")Linux下删除除一个文件外的所有文件2.删除除文件名1和文件名2之外的所有文件$rm-v!("文件名1"|"filename2")删除linux3下除部分文件外的所有文件下面的例子演示如何在linux4下通过交互方式$rm-i!(*.zip)删除除zip文件外的所有文件.接下来可以通过以下方式删除一个目录下除所有.zip和.odt文件外的所有文件,删除时会显示正在删除的文件:$rm-v!(*.zip|*.odt)删除指定文件扩展名以外的所有文件执行完所有必需的命令后,您还可以关闭extglobshell选项,如下所示。$shopt-uextglob在Linux下使用find命令删除文件。Inthisway,wecanuseonlytheappropriateoptionsofthefindcommandorusepipeswiththexargscommand,asfollows:$find/directory/-typef-not-name'PATTERN'-delete$find/directory/-typef-not-name'PATTERN'-print0|xargs-0-I{}rm{}$find/directory/-typef-not-name'PATTERN'-print0|xargs-0-I{}rm[选项]{}5.下面的命令会删除当前目录下除.gz以外的所有文件$find.-typef-not-name'*.gz'-deletefindcommand——Deleteallfilesexcept.gz6.使用管道和xargs,可以修改上面的例子如下:$find.-typef-not-name'*gz'-print0|xargs-0-I{}rm-v{}使用find和xargs命令删除文件7.让我们再看一个例子,以下命令行将删除当前目录中除.gz、.odt和.jpg之外的所有文件:$find.-typef-not\(-name'*gz'-or-name'*odt'-or-name'*.jpg'\)-delete删除除指定扩展名之外的所有文件file通过bash中的GLOBIGNORE变量删除文件但是,***方法仅在bash中有效。GLOBIGNORE变量为路径名扩展函数存储以冒号分隔的忽略模式(或文件名)列表。要使用此方法,请切换到要删除文件的目录,然后像这样设置GLOBIGNORE变量:$cdtest$GLOBIGNORE=*.odt:*.iso:*.txt在这种情况下,除了.odt,.iso和除.txt之外的所有文件将从当前目录中删除。现在,运行以下命令清除此目录:$rm-v*然后,关闭GLOBIGNORE变量:$unsetGLOBIGNORE使用bash变量GLOBIGNORE删除文件中使用的命令对应的手册页。就这样!如果您知道实现相同目录的其他命令行技术,请不要忘记通过下面的反馈部分与我们分享。
