如何保留一个文件扩展名并删除其他文件扩展名?

如何保留一个文件扩展名并删除其他文件扩展名?

我的目录中有很多文件扩展名:.tr0, .scs, .mt0, .ic0, .log, .st0, .pa0.

我想保留.tr0.scs删除所有其他扩展名。

有什么有效的方法可以代替:

rm *.mt0 *.ic0 *.log *.st0 *.pa0 

答案1

正面:

find . ! \( -name '*.tr0' -o -name '*.scs' \) -type f -exec echo rm -f {} +

echo(要执行命令时去掉)

如果您find支持-delete

find . ! \( -name '*.tr0' -o -name '*.scs' \) -type f -delete

上面的命令将递归地工作。如果您只想在当前目录中:

find . ! -name . -prune ! \( -name '*.tr0' -o -name '*.scs' \) -type f

答案2

在允许扩展通配模式的 shell 中,例如bash启用extglobshell 选项 ( shopt -s extglob) 或ksh93

rm ./*.!(tr0|scs)

扩展 shell 通配模式匹配除-delimited!(pattern-list)中指定的模式之外的任何内容。|pattern-list


请注意,如果目录名称包含点,该模式也会匹配目录名称,但由于rm默认情况下不会删除目录,因此这只会导致一些错误消息。

为了解决这个问题,可以使用一个循环,测试每个匹配的名称以确保它引用一个常规文件:

for name in ./*.!(tr0|scs); do
    [ -f "$name" ] && rm "$name"
done

相关内容