我有一个问题(我认为)需要一些脚本魔法 - 但不确定什么是最好的......
我有一个目录,其中包含许多不同格式的图片 - 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