在使用Linux系统的时候,有时可能会发现自己需要删除目录中的所有文件,或者只是通过删除除具有特定扩展名的文件(例如,以特定类型结尾的文件)之外的所有文件来清理目录。
那么,有没有什么好的方方法呢?实际上可以通过rm、find和globigore命令删除目录中的文件(同时排除某些特定文件类型) 。接下来将用一些示例进行演示,以帮助大家更好的理解。
在继续深入之前,首先需要了解一个在Linux中非常重要的概念——文件名模式匹配,这将更容易帮助我们解决当前的问题。在Linux系统中,Shell模式(Shell Pattern)是由以下特殊字符(称为通配符或元字符)组成的字符串:
*
:匹配零个或多个字符?
:匹配任意单个字符[seq]
:匹配seq
序列中的任意字符[!seq]
– 匹配不在seq
序列中的任意字符
接下来将介绍三种可能的方法,一起来看看吧。
一、使用扩展模式匹配运算符删除文件
扩展模式匹配运算符如下所示。在本例中,pattern-list 表示一个或多个文件名,文件名之间使用以下|
字符分隔:
*(pattern-list)
:匹配零次或多次指定的模式?(pattern-list)
:匹配零次或一次指定的模式+(pattern-list)
:匹配一次或多次指定模式的出现@(pattern-list)
– 匹配指定模式中的任意一个!(pattern-list)
– 匹配除指定模式之外的任何内容
要使用它们,请按如下方式启用extglob
Shell选项,命令如下:
shopt -s extglob
1、要删除目录中除特定文件之外的所有文件,请输入以下命令:
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] {}
1、以下命令将会删除当前目录中除.gz
文件之外的所有文件:
find . -type f -not -name '*.gz'-delete
2、使用管道和xargs,可以按如下方式修改上述情况:
find . -type f -not -name '*gz' -print0 | xargs -0 -I {} rm -v {}
3、最后再看一个示例,下面的命令将清除当前目录中除.gz
、.odt
和.jpg
文件之外的所有文件:
find . -type f -not \(-name '*gz' -or -name '*odt' -or -name '*.jpg' \) -delete
三、使用Bash GLOBIGNORE变量删除文件
需要注意的是,这种方法仅适用于bash。在这里,GLOBIGNORE变量存储了一个由冒号分隔的模式列表(文件名),用于在路径名扩展时被忽略。
要使用此方法,请进入想要清理的目录,然后按如下所示设置GLOBIGNORE变量:
cd test GLOBIGNORE=*.odt:*.iso:*.txt
在这个例子中,当前目录中除了 .odt
、.iso
和 .txt
文件之外的所有文件将被删除。
现在运行命令来清理目录:
rm -v *
然后,关闭GLOBIGNORE变量:
$ unset GLOBIGNORE
注意:要理解上述命令中使用的标志含义,请参考在各个示例中使用的每个命令的手册页。
小结
以上这些是在Linux中删除文件的几种简单有效的方法,能够保留只有特定扩展名或文件名的文件,使用起来相对比较简单。如果你需要删除除具有特定扩展名的文件,那么不妨试试以下方法。