1、非递归删除特定文件以外的文件

    1. # 开启extglob模式,能另外识别出5个模式匹配操作符
    2. shopt -s extglob
    3. # 删除当前目录下除java和py文件外的所有文件,不会删除文件夹
    4. rm !(*.java|*.py)

    需要注意,想要递归删除特定文件以外的文件,不能使用:rm -rf !(.java|.py)。因为-r递归,不仅会删除文件,还会把所有不以.py和.java结尾的文件夹全部删除掉。这样即使文件夹里有py和java文件,文件夹也会被删除掉,里面的文件自然也全部被删除。
    2、递归删除特定文件
    这时候需要使用强大的find命令;

    1. # type指定文件类型,f代表文件,d代表目录
    2. # -o代表or,能同时指定多个要删除的类型
    3. # xargs将find输出的字符串拆分为多个,分别调用rm命令。因为如果字符串过长,rm会报错
    4. # 这里无需使用rm -rf,因为find输出的都是文件,没有目录
    5. find -type f -name *.java -o -name *.py | xargs rm

    3、递归删除特定文件以外的文件

    1. # 每个-name前面都需要加取反符号!
    2. find -type f ! -name *.py ! -name *.java | xargs rm

    删除之后可能有不少空文件夹,这时候我们将空文件夹删除。

    1. find -type d -empty | xargs rm -rf

    这个命令只能删除最里面的空文件夹,不能递归。可能删除子目录后,父目录就变成了空文件夹。所以需要多调用几次。