我在目录结构中有一系列预览图像和 RAW 文件(如下所示),我快速查看预览图像,并删除那些我不想要的。
RAW 文件位于每个目录的 RAW 子目录中。
我正在寻找的是一个 bash 命令,或者一个小脚本,如果具有相应预览图像的文件不存在,它将删除 RAW 文件。
子目录树如下所示:
2016/
05/
image1.jpg
image2.jpg
image3.jpg
RAW/
image1.RAW
image2.RAW
image3.RAW
正如您可以想象的那样,有多个年份和月份子目录,偶尔如果发生了大型事件,月份子目录下面可能还会有一组子目录(如下所示),所以理想情况下,我正在寻找可以插入的内容cron 每天/每周运行一次,以便在我进行任何审查/更改后进行整理。
2016/
05/
image1.jpg
image2.jpg
image3.jpg
RAW/
image1.RAW
image2.RAW
image3.RAW
event 1/
image4.jpg
image5.jpg
image6.jpg
RAW/
image4.RAW
image5.RAW
image6.RAW
event 2/
image7.jpg
image8.jpg
image9.jpg
RAW/
image7.RAW
image8.RAW
image9.RAW
答案1
更简单的是 Costas 方式,无需任何脚本,但使用内置、正确的目录和正确的命令替换。 (未测试)
find 2016 -name '*.RAW' -execdir sh -c '[ ! -f "../${0%.RAW}.jpg" ]' {} \; -delete
编写一个 bash 脚本来做这件事很简单,一些 globstar (**) 和一些 [[]] 就完成了!
答案2
已测试并工作。
#!/usr/bin/env bash
#delete RAW if Preview img doesn't exists
createTest() {
local dir=$1
rm -rf "$dir"
mkdir -p "$dir"/05/{"event 1","event 2"}/RAW/
mkdir -p "$dir"/05/RAW
touch "$dir"/05/RAW/image{1..3}.RAW; touch "$dir"/05/image{1..2}.jpg
touch "$dir/05/event 1/RAW/"image{4..6}.RAW; touch "$dir/05/event 1/"image{4..5}.jpg
touch "$dir/05/event 2/RAW/"image{7..9}.RAW; touch "$dir/05/event 2/"image{7..8}.jpg
}
deleteRAW() {
local jpg=
local t=
shopt -s globstar;
for raw in "$1"/**/*.RAW; do
t=${raw##*/}
jpg=${raw%/*}/../${t%.*}.jpg
if [[ ! -f $jpg ]]; then
rm -f "$raw"
echo "Removed $raw"
fi
done;
}
for dir; do
createTest "$dir"
deleteRAW "$dir"
done
测试:
]➬./delete.sh 2016
Removed 2016/05/RAW/image3.RAW
Removed 2016/05/event 1/RAW/image6.RAW
Removed 2016/05/event 2/RAW/image9.RAW
用空格测试:
]➬./delete.sh "2016 spaces"
Removed 2016 spaces/05/RAW/image3.RAW
Removed 2016 spaces/05/event 1/RAW/image6.RAW
Removed 2016 spaces/05/event 2/RAW/image9.RAW
具有多个目录:
]➬./delete.sh "2016 spaces" 2017
Removed 2016 spaces/05/RAW/image3.RAW
Removed 2016 spaces/05/event 1/RAW/image6.RAW
Removed 2016 spaces/05/event 2/RAW/image9.RAW
Removed 2017/05/RAW/image3.RAW
Removed 2017/05/event 1/RAW/image6.RAW
Removed 2017/05/event 2/RAW/image9.RAW
您可以随意使用其他解决方案来测试它,注释掉最后一行中的deleteRAW 调用。
for dir; do
createTest "$dir"
#deleteRAW "$dir"
done
干杯,祝你好运。 :)
答案3
如果基于相同名称但不同扩展名的通信
find 2016 -name '*.RAW' -exec bash -c '[ ! -f "${0//RAW/}jpg" ]' {} \; -delete
答案4
在 zsh 中,您可以使用e
全局限定符过滤通配符匹配。
rm **/*.RAW(e\''[[ ! -e ${REPLY//\/RAW\//\/}:r.jpg ]]'\')