我的目录中有很多文件扩展名:.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
启用extglob
shell 选项 ( 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