如果另一个子目录中没有同名但扩展名不同的相应文件,则删除文件的脚本

如果另一个子目录中没有同名但扩展名不同的相应文件,则删除文件的脚本

我在目录结构中有一系列预览图像和 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 ]]'\')

相关内容