创建文件列表,删除具有不同后缀的“重复项”

创建文件列表,删除具有不同后缀的“重复项”

我有一个问题(我认为)需要一些脚本魔法 - 但不确定什么是最好的......

我有一个目录,其中包含许多不同格式的图片 - jpg、gif、png、tiff 和 svg。

一些(不是全部!) png 和 svg 文件是成对的 - 即。同一图像的一张 png 和一张 svg 版本,两者具有相同的文件名,只是后缀不同(例如,figleaf.png 和 Figleaf.svg)。

我需要一个脚本来获取文件列表(由 制作ls),并删除所有双胞胎的 svg 版本,只留下 png 版本。所有其他文件(非双胞胎) - 包括没有 png-twin 的 svg 文件 - 应保留在列表中(以及双胞胎的 png 版本)。或者,使用相应的 png-twin 创建所有 svg 文件列表的脚本。

我认为一些双胞胎的版本之间可能略有不同 - 例如。 Figleaf.png 和 FigLeaf.svg - 所以如果脚本可以的话那就太好了可选地更改为忽略字母的大小写。

答案1

您可以使用 bash/ksh 来做到这一点:

for i in *.svg; do test -e "${i%.*}.png" && rm "$i"; done

或者,格式不同:

for i in *.svg; do
    test -e "${i%.*}.png" && rm "$i"
done

在执行实际删除之前将rm其替换为测试。echo

编辑 :

sputnick 刚刚在他的回答中编辑了一个与此非常相似的解决方案,您应该接受他的解决方案,因为他是第一个回答的。

答案2

尝试使用以下方法执行此操作:

i如果要区分大小写,请删除替换中的修饰符)

$ perl -e '
    foreach my $file (<*.png>) {
       ($ext_free = $file) =~ s/\.png//i;
       unlink "$ext_free.svg" if -e "$ext_free.svg";
    }
' *.[Pp][Nn][Gg]

要先尝试一下,请用 aprint代替unlink

或使用:

shopt -s nocaseglob # case insensitive
# use 'shopt -u nocaseglob' for case sensitive
for file in *.png; do
    [[ -e ${file%.png}.svg ]] && rm -f "${file%.png}.svg"
done

相关内容