如何使用shell删除目录的部分文件?

Tags: linux shell

我是一个新linux操作系统用户,我希望清除我的download目录,比如:删除~/Downloads目录下所有文件,但要保留以下类型文件:

  • *.iso- 所有的iso镜像文件

  • *.zip- 所有的zip文件

我如何在Linux、OS X或者Unix-like操作系统上达到这目的呢?

Bash支持多种文件模式通配符,比如:

  1. *:匹配任意文件名

  2. ?:匹配文件名中单个字符

  3. [...]:匹配括号中得任意一个字符

方法1:想扩展模式匹配操作符说声hello把

你需要使用shopt来配置shell的extglob选项来使用扩展模式匹配操作符,有以下类型的操作符:

  1. ?(pattern-list):匹配 0或1 个给定的模式

  2. *(pattern-list):匹配 0或多 个给定的模式

  3. +(pattern-list):匹配 1或多 个给定的模式

  4. @(pattern-list):匹配 1 个给定的模式

  5. !(pattern-list):匹配不在给定模式所有内容

pattern-list是模式的列表(文件名)使用 "|" 分割。首先我们开启extglob选项:

shopt -s extglob

删除除了.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/vivek/!(*.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的GLOBAIGNORE变量

GLOBIGNORE变量是一个用冒号":"分割的模式列表,用来定义一组需要在路径扩展中忽略的文件名。如果一个文件名匹配一个路径扩展模式并且也匹配一个GLOBIGNORE中得模式,那么它将会从匹配列表中移除。

参考下面命令来配置GLOBIGNORE,删除除.zip和.iso之外的所有文件(仅适用于Bash Shell):

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

方法3: 使用find命令

如果你使用 tcsh/csh/sh/ksh 或其他shell(当然也包括bash),已可以参考下面的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命令man page 以及 find命令man page

本文链接:http://www.4byte.cn/learning/1819/ru-he-shi-yong-shell-shan-chu-mu-lu-de-bu-fen-wen-jian.html