答案1
第一个问题似乎是因为当convert
收到列表时,它将使用指定的最后一个文件作为输出文件名。所有新文件都以最后一个文件命名,而该文件本身保持不变(这不太可能是您想要或期望的,但这可能比您的文件被意外覆盖要好)。
当目录中只有一个文件时(因此您的 glob 会扩展为一个文件),convert
会抱怨缺少定义的图像,因为它需要指定至少一个输入文件和一个输出文件名。您为 glob 使用的位置是输出文件名位置,因此convert
会抱怨第二幅图像中缺少输入文件。
为了获得更可靠的结果,您应该指定输入和输出文件:
convert input-file.jpg -crop 599x500+147+200 new-file.jpg
如果名称很长,您应该能够对输入文件和输出文件使用制表符补全(键入前几个字符,然后按制表符让 shell 完成名称)(也就是说,对我来说它工作正常)。
对于批处理,您可以使用 shell 在每个文件上运行一次命令,并使用一些字符串操作来构造新名称,因此新文件具有合理的名称,例如:
for f in *.jpg; do
echo convert "$f" -crop 599x500+147+200 "${f/.jpg/-cropped.jpg}"
done
第二行echo
显示了新名称。如果新名称看起来正确,您可以删除echo
并再次运行命令以实际裁剪图像。
将新文件放入新目录可能更容易,特别是当您的文件名具有不同的扩展名时......
mkdir cropped
for f in *.jpg *.png; do
echo convert "$f" -crop 599x500+147+200 cropped/"$f"
done
再次强调,您需要先将其删除,echo
然后才能执行任何操作。