删除指定文件之外的所有文件

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

  • 方法1:通过使用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

推荐在子shell运行,这样不会对当前shell产生影响:

 [root@devops work]# (shopt -s extglob; rm -rf !(filename))
  • 方法2:通过使用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' `
  • 方法3:通过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]#

原文链接:http://www.osetc.com/archives/506.html

你可能感兴趣的:(linux,shell)