将一堆带有“.jpg”扩展名的 PNG 图像重命名为“.png”

Rename a bunch of PNG images with ".jpg" extension to ".png"

所以我有一个包含数千个图像文件的文件夹,所有这些文件都保存为 .jpg

问题是其中一些文件实际上是 PNG 图像文件,因此它们无法在很多程序中打开,除非我手动将它们的扩展名更改为 .png。例如,Ubuntu 图像查看器抛出此错误:

"Error interpreting JPEG image file (Not a JPEG file: starts with 0x89 0x50)"

我已经 运行 对其中一些文件进行了 hexdump 以确认此错误并检查出来。

我正在寻找一种简单的方法来在其他文件中找到所有扩展名错误的文件并更改它们的扩展名。例如,我将如何使用 bash 脚本执行此操作?到目前为止我还不知道。感谢所有帮助!

我不确定 bash 脚本的适当命令,但您可以轻松编写 C++ 文件来尝试打开这些文件并捕获错误。您捕获错误的文件将不是适当的类型(假设这是您唯一的问题)。如果您知道那些不正确的文件类型应该是 PNG,您可以重命名该文件。类似于伪代码:

For (ALL_FILES)
{
  try 
  {
    open(FILENAME);
  }
  catch
  {
    rename(FILENAME, NEW_FILENAME);
  }
}

您想使用 file 并解析输出。您可以通过检查输出的初始部分来检查它是 JPEG 还是 PNG:

F="filename.jpg"
TYPE=$(file -b $F)
[[ $TYPE == JPEG\ image\ data* ]] && echo "jpg"
[[ $TYPE == PNG\ image\ data* ]] && echo "png"

您可以通过删除 .jpgbasename 来更改扩展名。例如,以下将扩展名为 .jpg 的文件 $F 的扩展名更改为 .png

mv $F $(dirname $F)/$(basename $F .jpg).png

首先获取一个文件列表,并将它们制作成一个文件。 然后将列表处理成一个循环,以便您可以自动一个一个地更改文件。

#!/bin/bash

FILE=/tmp/list ## Assuming the list of files are in this file.
for file in $(cat $FILE); do 
   OLD_FILE=$file
   NEW_FILE=$(echo $file|sed -e 's/jpg$/png/')
   mv $OLD_FILE $NEW_FILE
done
for f in *.jpg ; do
  if [[ $(file -b --mime-type "$f") = image/png ]] ; then
    mv "$f" "${f/%.jpg/.png}"
  fi
done

这会获取 .jpg 个文件的列表,然后对每个文件调用 file 实用程序以获取 MIME 类型。如果是 image/png,则它使用 string manipulation 替换重命名文件。

使用 file (1) to determine the type of all files. Use grep (1) 过滤此列表,删除所有正确的 JPEG 文件。剩下的是无法识别为 JPEG 的文件列表。

单行

file *.jpg | grep -v "JPEG image data"

– 确保在正确识别的 JPG 文件上验证 JPEG image data 确实是 file returns。

你可以用sed (1)去掉冒号:后面的东西,最后只剩下文件名:

file *.jpg | grep -v "JPEG image data" | sed 's/:.*//'

..这是我的bash-fu的结尾。此时我将结果列表存储在一个文件中(添加 > list)并在文本编辑器中使用 GREP 将所有行重写为正确的重命名命令,然后 运行 那。