Bash 脚本删除没有相应 JPEG 文件的 RAW 文件

Bash 脚本删除没有相应 JPEG 文件的 RAW 文件

我会以 RAW/JPEG 模式拍摄相机,由于 RAW 图像很大(文件大小),因此需要很长时间才能预览它们,因此我预览 JPEG,并删除那些我不想要的图像。

例如,如果我有:

image1.CR2
image1.jpg
image2.CR2
image2.jpg
image3.CR2
image4.CR2
image5.CR2
...

我想删除.CR2没有匹配的.jpg(本例中的图像 3 到 5)。

我遇到了以下代码:

rm *.CR2(e:'[[ ! -e ${REPLY%.CR2}.jpg ]]':)

但它在我的机器上不起作用。我在驴的这些年里没有接触过 Bash,所以我在尝试解决它时不知所措。

我收到错误:

-bash: syntax error near unexpected token `('

有人能指出我正确的方向吗?

答案1

只需使用一个循环:

for x in *.CR2
do
    [ -e "${x%.CR2}.jpg" ] || echo rm "$x"
done

它会查看每个.CR2文件并调用它x${x%.CR2}扩展为.CR2删除的文件名,所以我们添加.jpg扩展名并检查它是否存在-e。如果没有,我们将删除原始.CR2文件。

上面有一个额外的内容echo,因此您可以在实际删除任何内容之前检查它是否选择了您想要的文件。如果需要,您可以将所有内容放在一行中:

for x in *.CR2 ; do [ -e "${x%.CR2}.jpg" ] || echo rm "$x"; done

并且可以轻松进行交互式编辑。

有些 shell 具有更强大的参数扩展,可能能够做到这一点,但 Bash 不是其中之一。我怀疑您找到的代码是针对其中之一。

相关内容