我想删除每个没有 JPG 对应项的 RAW 图像文件(照片图像)。
这是我当前的工作流程:
- 我的相机为我拍摄的每张照片创建 RAW 和 JPG。
- 我查看 JPG 文件,并删除我不需要的文件(因为 JPG 加载速度要快得多)
- 我目前手动思考该文件夹,选择任何没有 JPG 对的 RAW 文件(在我的例子中为 *.cr3)(因为我在审阅过程中删除了 JPG)。
在我查看文件之前,文件的外观示例:
IMG_001.JPG
IMG_001.CR3
IMG_002.JPG
IMG_002.CR3
IMG_003.JPG
IMG_003.CR3
IMG_004.JPG
IMG_004.CR3
文件在我审阅之后的样子的示例
IMG_001.JPG
IMG_001.CR3
IMG_002.CR3
IMG_003.JPG
IMG_003.CR3
IMG_004.CR3
IMG_002 和 IMG_004 都缺少 jpg 对应项,这意味着我删除了该 jpg 对应项,现在我想删除原始文件。
这是我现在的代码:
for files in RAW/*
do
test="JPG/$(basename ${files::9})JPG"
if [ ! -f "$test" ]
then echo "$files"
fi
done
或者,流畅的单行版本:
for files in RAW/*; do if [ ! -f "JPG/$(basename ${files::9})JPG" ]; then echo "$files"; fi done
或者,另一衬垫:
For files in RAW/*; [ ! -f "JPG/$(basename ${files::9})JPG" ] && echo "JPG/$(basename ${files::9})JPG"
该代码假设 raw 和 jpg 文件位于不同的文件夹中,这很好。不过,将它们放在同一个文件夹中会稍微方便一些。
基本上,我想知道如何编写这个脚本。我正在 Mac OSX 15 Catalina 上使用终端。
答案1
由于文件位于同一目录中,所以让我们保持简单。
#!/bin/sh
for file in *.CR3; do
noext=${file%.CR3}
[ -f "$noext.JPG" ] || rm -- "$file"
done
该脚本循环遍历.CR3
当前目录中的所有文件。它从文件名中删除扩展名noext=${file%.CR3}
.如果.JPG
对应项不存在,则.CR3
删除该文件 ( [ -f "$noext.JPG" ] || rm -- "$file
)。
您可能需要在和echo
之间添加一个,以在实际执行脚本之前查看操作是否正确。||
rm
答案2
如果您的文件如您所写,您可以通过以下方式找到您需要的所有文件
\ls -1 *.JPG *.CR3 | cut -d. -f1 | uniq -c | sed '/\<2\>/d
s/^[^I]*\(.*\)/\1.CR3/'
并删除它们。完整的命令将是
rm $(\ls -1 | cut -d. -f1 | uniq -c | sed '/\<2\>/d
s/^[^I]*\(.*\)/\1.CR3/')
实际上,您可以通过 获取每个文件的基本名称cut
,将其发送uniq -c
到 count,删除具有 2 个实例的所有文件,然后删除 1 个实例并添加扩展名CR3
。