在文件夹中,我可能有以下类型的文件名:
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.xmp
和something.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" ) ]]
但我从来没有得到我需要的结果。
答案 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}}才能实际执行删除。否则,它会进行干运行,只是说它会删除哪些文件。