通过扩展删除孤立的sidecar文件

时间:2018-02-13 00:29:32

标签: bash

在文件夹中,我可能有以下类型的文件名:

filename.imageExtension
filename.imageExtension.sidecarExtension
filename.sidecarExtension

扩展名如下:

imageExtension可以是多种扩展程序,例如:.nef.raf.orf等。

sidecarExtension可以是一些扩展程序,例如:.xmp.pts.pp3等。

因此,在文件夹中,我可以使用以下文件:

tree.nef
tree.nef.pp3

car.raf
car.xmp
car.raf.pp3

house.xmp
something.nef.pp3

在这种情况下,house.xmpsomething.nef.pp3是应删除的孤立文件 确定这些文件是孤立的是,没有相应的图像文件(具有相同名称但具有imageExtension且没有sidecarExtension的文件)。

有没有办法删除所有孤立文件,只删除带有bash脚本的孤立文件?

我一直在尝试使用嵌套for循环和if语句来执行此操作:

if [[ -e $(echo "$filename" | sed "s/"$imageExtension"/"$sidecarExtension"/g" ) ]]

if [[ -e $(echo "$filename" | sed "s/"$imageExtension""$sidecarExtension"/"$sidecarExtension"/g" ) ]]

但我从来没有得到我需要的结果。

1 个答案:

答案 0 :(得分:4)

这是一个可能的解决方案:

shopt -s nullglob extglob;

# Get all sidecar files
for file in *.{xmp,pts,pp3}
do
  # Generate all permutations of filenames that it may belong to,
  # and let globbing delete the ones that don't exist
  candidates=("${file%.*}"@() "${file%.*}".{nef,raf,orf}@()); 

  # If none exist, the file can be deleted
  [[ ${#candidates[@]} -eq 0 ]] && echo rm "$file"
done

它依赖于以下事实:如果文件存在,"file"@()将扩展为file,如果文件不存在,则会扩展为echo

如果不明显,则必须删除{{1}}才能实际执行删除。否则,它会进行干运行,只是说它会删除哪些文件。