我的文件夹中有许多 webp 格式的图像,但扩展名为 .jpg ,例如
abc-test.jpg
这是 webp 格式的图片。我希望它以与我使用此命令相同的名称转换为.png格式,并且有效
查找。 -name“ * .jpg” -exec dwebp {} -o {} .png \;
它已将所有<strong> webp 图片转换为 .png ,但问题是它正在保存这样的图片:
abc-test.jpg.png
如何保存没有
之类的 .jpg 扩展名abc-test.png
答案 0 :(得分:1)
如果要转换/重命名的文件很多,我建议您使用 GNU Parallel ,不仅可以通过并行执行它们来更快地转换它们,还可以利用修改文件名的功能。
您想要的命令是:
parallel dwebp {} -o {.}.png ::: *.jpg
其中{.}
表示“不带原始扩展名的文件名” 。
如果您也想递归到子目录,则可以使用:
find . -name "*.jpg" -print0 | parallel -0 dwebp {} -o {.}.png
如果您需要进度表或“预计到达时间” ,则可以在--progress
命令后添加--eta
或parallel
。 / p>
如果要查看 GNU Parallel 将运行什么,而又不实际运行任何内容,请添加--dry-run
。
在这个CPU越来越“笨拙” (越来越多的内核)而不是更快的时代,我向您推荐 GNU Parallel 。
答案 1 :(得分:0)
一件好事是将sed与mv一起使用。它与模式匹配,并替换为较新的模式。
for file in *.jpg;
do
mv "$file" "`echo $file | sed s/.jpg/.png/`"
done
如果要保留旧文件而不是 mv ,则可以使用 cp
答案 2 :(得分:0)
我是用短的oneliner做到的,不需要在系统中安装parallel
for x in `ls -1 *.jpg`; do dwebp {} -o ${x%.*}.png ::: $x; done
这适用于当前目录
我会尝试修改@ mark-setchell递归解决方案,使其看起来像这样:
for x in `find . -name "*.jpg"`; do dwebp {} -o ${x%.*}.png ::: $x; done
${x%.*}
部分是需要在此处进行解释的部分-它告诉bash使用.
以及x
变量中点之后的所有内容。
带有更多点的名称容易出现异常,因为我没有检查这里的正则表达式是懒还是贪婪-因此可以进一步调整答案。