将所有 BMP 文件递归转换为带空格的 JPG 处理路径,并在 Linux 下获取文件扩展名

convert all BMP files recursively to JPG handling paths with spaces and getting the file extension right under Linux

我的文件具有漂亮的、全局友好的路径名,例如:

/New XXXX_Condition-selected FINAL/677193  2018-06-08 Xxxx Event-Exchange_FINAL/Xxxxx Dome Yyyy Side/Xxxx_General016 #07-08.BMP

Xxx...Yyyy 字符串是出于隐私原因)。当然格式不是固定的:文件夹层级的深度可以变化,但是空格、字母和符号如_-#都可以出现,或者作为文件的一部分文件名的路径或部分,或两者。

我的目标是递归所有子文件夹,找到 .BMP 文件并将它们转换为 JPG 文件,没有“双重”扩展名,例如 .BMP.JPG:换句话说,上面的文件名必须成为

/New XXXX_Condition-selected FINAL/677193  2018-06-08 Xxxx Event-Exchange_FINAL/Xxxxx Dome Yyyy Side/Xxxx_General016 #07-08.JPG

我可以使用 bash shell 工具或 Python。你能帮帮我吗?

PS我不需要原文件,可以覆盖。当然,不覆盖它们的解决方案也很好 - 我将继续使用 find . -name "*.BMP" -type f -delete 命令。

你要不要试试:

find . -type f -iname "*.BMP" -exec mogrify -format JPG '{}' +

命令mogrifyImageMagick套件的一个工具,mogrify -format JPG file.BMP相当于convert file.BMP file.JPG。 您可以添加 convert 接受的相同选项,例如 -qualitymogrify 的好处是它可以一次对多个文件执行相同的转换,而无需指定输出(转换后的)文件名。 如果命令发出警告:mogrify-im6.q16: length and filesize do not match,则表示BMP 头中存储的图像大小与图像数据块的实际大小不一致。 如果正确生成 JPG 文件,您可以忽略这些警告。否则您将需要修复导致警告的 BMP 文件。

如果输入文件和输出文件具有相同的扩展名(在这样的 JPG 到 JPG 的转换,并调整大小),原始文件将被覆盖。 如果它们像这次一样有不同的扩展名,则原始 BMP 文件是 没有删除。您也可以使用 find 删除它们。