我有以下方式的文件列表:
> file1.jpg
> file1_orig.jpg
> file2.jpg
> file2_orig.jpg
我想保留所有扩展名为 _orig.jpg 的文件并丢弃那些不扩展的文件。如何使用 bash 来实现这一点?
答案1
你可以使用 Bash 的扩展文件名扩展:
rm !(*_orig.jpg)
语法!(pattern)
:
匹配除给定模式之一之外的任何内容。
因此这会扩展到所有不匹配的文件名*_orig.jpg
,您可以删除(或移开)。您需要extglob
启用该选项,您可以使用shopt -s extglob
事先(否则您将收到“未找到事件”形式的错误)。不过,它通常是默认启用的。
或者,您也可以只移动想要暂时保留的文件并删除其余文件:
mkdir tmp
mv *_orig.jpg tmp
rm *.jpg
mv tmp/*.jpg .
rmdir tmp
有选项使用find
还有:
find . -type f ! -name '*_orig.jpg' -exec rm '{}' +
这将在当前目录中递归地找到任何未命名的(常规)文件*_orig.jpg
并删除它们;如果文件并非全部直接位于一个目录中,那么这是您最好的(但不仅仅是)选择。
答案2
POSIX方式:
$ find . \( ! -name . -prune -a -name "*.jpg" -a ! -name "*_orig.jpg" \) -exec rm -- {} +