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