Linux:Bash删除目录中除少数文件外的所有文件

时间:2020-01-09 10:41:14  来源:igfitidea点击:

如何清理下载目录,即从~/Downloads /文件夹中删除所有文件,但以下类型除外:

  • .iso所有iso镜像文件。
  • .zip所有zip文件。

在Linux,OS X或类似Unix的系统上,如何删除除bash shell中的文件以外的所有文件?
Bash Shell支持丰富的文件模式匹配,例如:

  • *匹配任何文件。
  • ?匹配文件名中的任何单个字符。
  • [...]匹配任何一个括号内的字符。

方法1:扩展模式匹配运算符

您需要使用shopt内置命令来使用extglobshell选项,以使用扩展模式匹配运算符,例如:

  • ?(pattern-list)-匹配零个或一次出现的给定模式。
  • *(pattern-list)-匹配零个或多个给定的模式。
  • +(pattern-list)-匹配给定模式的一个或多个出现。
  • @(pattern-list)-匹配给定的模式之一。
  • !(pattern-list)-匹配除给定模式之一以外的任何内容。

模式列表不过是由一个|分隔的一个或多个模式(文件名)的列表。

首先,打开extglob选项:

shopt -s extglob

Bash删除除zip和iso文件以外的所有文件

rm命令的语法为:

## Delete all file except file1 ##
rm  !(file1)
 
## Delete all file except file1 and file2 ##
rm  !(file1|file2) 
 
## Delete all file except all zip files ##
rm  !(*.zip)
 
## Delete all file except all zip and iso files ##
rm  !(*.zip|*.iso)
 
## You set full path too ##
rm /Users/Hyman/!(*.zip|*.iso|*.mp3)
 
## Pass options ##
rm [options]  !(*.zip|*.iso)
rm -v  !(*.zip|*.iso)
rm -f  !(*.zip|*.iso)
rm -v -i  !(*.php)

最后,关闭extglob选项:

shopt -u extglob

方法2:使用bash GLOBIGNORE变量删除除特定文件以外的所有文件

用冒号分隔的模式列表,定义路径名扩展将忽略的文件名集。
如果与路径名扩展模式匹配的文件名也与GLOBIGNORE中的模式之一匹配,则将从匹配列表中将其删除。

要删除除zip和iso文件以外的所有文件,请按如下所示设置GLOBIGNORE:

## only works with BASH ##
cd ~/Downloads/
GLOBIGNORE=*.zip:*.iso
rm -v *
unset GLOBIGNORE

方法3:查找命令以rm除zip和iso文件之外的所有文件

如果使用的是tcsh/csh/sh/ksh或任何其他Shell,请在类Unix系统上尝试以下find命令语法来删除文件:

find /dir/ -type f -not -name 'PATTERN' -delete

或者

## deals with weird file names using xargs ##
find /dir/ -type f -not -name 'PATTERN' -print0 | xargs -0 -I {} rm {}
find /dir/ -type f -not -name 'PATTERN' -print0 | xargs -0 -I {} rm [options] {}

要删除~/sources /目录中除php文件以外的所有文件,请执行:

find ~/sources/ -type f -not -name '*.php' -delete

或者

find ~/sources/ -type f -not -name '*.php' -print0 | xargs -0 -I {} rm -v {}

删除除zip和iso以外的所有文件的语法如下:

find . -type f -not \( -name '*zip' -or -name '*iso' \) -delete

有关更多信息,请参见bash命令手册页和find命令手册页。