删除文件名中没有关键字的所有文件

删除文件名中没有关键字的所有文件

我有以下方式的文件列表:

> 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 -- {} +

相关内容