Linux:Bash删除目录中除少数文件外的所有文件
时间:2020-01-09 10:41:14 来源:igfitidea点击:
如何清理下载目录,即从~/Downloads /文件夹中删除所有文件,但以下类型除外:
.iso
所有iso镜像文件。.zip
所有zip文件。
在Linux,OS X或类似Unix的系统上,如何删除除bash shell中的文件以外的所有文件?
Bash Shell支持丰富的文件模式匹配,例如:
*
匹配任何文件。?
匹配文件名中的任何单个字符。[...]
匹配任何一个括号内的字符。
方法1:扩展模式匹配运算符
您需要使用shopt内置命令来使用extglob
shell选项,以使用扩展模式匹配运算符,例如:
?(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命令手册页。