Bash 按扩展名删除孤立的sidecar文件

Bash 按扩展名删除孤立的sidecar文件,bash,Bash,在文件夹中,我可能有以下类型的文件名: filename.imageExtension filename.imageExtension.sidecarExtension filename.sidecarExtension 延长期限如下: imageExtension可以是许多扩展,如:.nef、.raf、.orf等 SideCareExtension可以是一些扩展,如:.xmp,.pts,.pp3,等等 例如,在一个文件夹中,我可以有如下文件: tree.nef tree.nef.pp3 c

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

filename.imageExtension
filename.imageExtension.sidecarExtension
filename.sidecarExtension
延长期限如下:

imageExtension可以是许多扩展,如:
.nef
.raf
.orf

SideCareExtension可以是一些扩展,如:
.xmp
.pts
.pp3
,等等

例如,在一个文件夹中,我可以有如下文件:

tree.nef
tree.nef.pp3

car.raf
car.xmp
car.raf.pp3

house.xmp
something.nef.pp3
在本例中,
house.xmp
something.nef.pp3
是应删除的孤立文件。确定这些文件是孤立的是,没有相应的图像文件(具有相同名称但具有imageExtension且没有sidecarExtension的文件)

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

我一直在尝试使用嵌套for循环和if语句,如:

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


但我从未得到我需要的结果。

这里有一个可能的解决方案:

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
它依赖于这样一个事实,即使用nullglob和extglob时,
“file”@()
将扩展为
文件(如果文件存在),或者如果文件不存在,则什么也不会扩展


如果不明显,则必须删除
回显
,才能实际执行删除操作。否则,它将进行一次试运行,只需说出它将删除哪些文件。

这很好。有没有办法用列表代替
{xmp,pts,pp3}
{nef,raf,orf}
?类似于
sidecar=(xmp,pts,pp3)image=(nef,raf,orf)
。有很多图像格式,我想把它们放在脚本开头的列表中@另一个家伙是个好把戏!我可能误解了这个问题,但请您解释一下第一个
“${file%.*}”@()
的目的是什么?谢谢:)@PesaThe如果foo.bar存在(而不是foo.bar.nef),那么sofoo.bar.pp3将被视为非孤儿。在这种情况下,它不会检查扩展名。@vato不会直接检查,不会。可以使用嵌套的loopsHow重写它。我们可以在文件名中添加一个版本号(格式为“_nn”,其中nn是两位数字)来保存xmp吗?我的意思是,如果有pic1.nef、pic1.nef.xmp和pic1_01.nef.xmp,我也想保留最后一个。例如,当我们处理同一初始原始文件的不同版本时,这些xmp是由诸如darktable之类的程序创建的。
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