Skip to content Skip to main navigation Skip to footer

Linux:Bash shell如何删除目录下除了特定类型文件外的所有文件

于在linux环境下工作的人来说,需要经常对目录下的文件做操作,包括创建文件,删除文件,链接文件,或者拷贝文件等等。现在有一个需求是,如何通过bash shell 删除特定目录下的除了文件名包含.gz 或者.zip的所有文件?我们平时做的最多的关于删除文件的操作是删除特定模式的文件,通过使用rm命令,再加上linux下三个通配符:*,?, [..].
其中:* – 是匹配任意字符
?- 匹配任意一个单一字符
[…] – 匹配任意一个方括号中的字符

通过使用shopt扩展模式匹配

如果之前使用过shopt命令的话,应该都知道shopt和set命令类似,用来定制shell的环境。下面我们通过下面的shopt命令来扩展shell的模式匹配功能,这样的话,上面的三个通配符的功能会被扩展,而且还会引入新的元字符。

[root@devops work]# shopt -s extglob

之后我们就可以使用特有的元字符“!”来删除除特定文件之外的所有文件,下面是一个具体的例子:

[root@devops work]# ls
aa aa.tar.gz bb cc
[root@devops work]# rm -rf !(aa.tar.gz)
-bash: !: event not found
[root@devops work]# shopt -s extglob
[root@devops work]# rm -rf !(*.gz)
[root@devops work]# ls
aa.tar.gz

当删除完文件之后,可以使用下面的命令关掉extglob选项。
[root@devops work]# shopt -u extglob

通过使用grep和rm命令结合来实现删除除特定文件的所有文件

我们可以使用grep命令特有的选项“-v”来查找出所有除特定文件的所有文件,然后再通过rm命令来删除,下面再举个例子:

[root@devops work]# ls
aa aa.tar.gz bb cc
[root@devops work]# ls | grep -v '.gz' | xargs rm -rf
[root@devops work]# ls
aa.tar.gz

或者

rm `ls | grep -v '.gz'`

通过find命令来删除除特定文件外的所有文件

使用过find的人应该都知道,find命令的功能相当的强大,选项众多。我们可以使用下面的命令来实现该需求:

[root@devops work]# ls
aa aa.tar.gz bb cc
[root@devops work]# find ./ -type f -not -name '*.gz' -delete
[root@devops work]# ls
aa.tar.gz
[root@devops work]#

 
 

0 Comments

There are no comments yet

Leave a comment

Your email address will not be published.