Image 使用“重命名”重命名一组PNG图像;。jpg";扩展到";。巴布亚新几内亚“;

Image 使用“重命名”重命名一组PNG图像;。jpg";扩展到";。巴布亚新几内亚“;,image,bash,scripting,png,jpeg,Image,Bash,Scripting,Png,Jpeg,因此,我有一个包含数千个图像文件的文件夹,它们都保存为.jpg 问题是,其中一些文件实际上是PNG图像文件,因此它们不会在许多程序中打开,除非我手动将其扩展名更改为.PNG。例如,Ubuntu图像查看器抛出以下错误: “解释JPEG图像文件时出错(不是JPEG文件:以0x89开头 0x50)” 我已经对其中的一些文件运行了一个hextump,以确认这个错误,并将其检查出来 我正在寻找一种简单的方法来查找其他文件中所有扩展名错误的文件,并更改其扩展名。例如,我如何使用bash脚本来实现这一点?到目

因此,我有一个包含数千个图像文件的文件夹,它们都保存为
.jpg

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

“解释JPEG图像文件时出错(不是JPEG文件:以0x89开头 0x50)”

我已经对其中的一些文件运行了一个hextump,以确认这个错误,并将其检查出来


我正在寻找一种简单的方法来查找其他文件中所有扩展名错误的文件,并更改其扩展名。例如,我如何使用bash脚本来实现这一点?到目前为止我还不知道。感谢大家的帮助

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

用于(所有_文件)
{
尝试
{
打开(文件名);
}
抓住
{
重命名(文件名,新文件名);
}
}

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

F="filename.jpg"
TYPE=$(file -b $F)
[[ $TYPE == JPEG\ image\ data* ]] && echo "jpg"
[[ $TYPE == PNG\ image\ data* ]] && echo "png"
您可以通过使用
basename
剥离
.jpg
来更改扩展名。例如,以下命令将扩展名为
.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
这将获取
.jpg
文件的列表,然后为每个文件调用
文件
实用程序以获取mime类型。如果是
image/png
,则使用替换重命名文件。

用于确定所有文件的类型。用于筛选此列表,删除所有正确的JPEG文件。剩下的是无法识别为JPEG的文件列表

一行

file *.jpg | grep -v "JPEG image data"
–确保确认
JPEG图像数据
确实是
文件
在正确识别的JPG文件中返回的内容

您可以使用删除冒号后面的内容
,并以文件名结束:

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

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

这假设
打开
尝试解析文件数据,并且依赖于文件扩展名才能正确。在现有文件上,简单的“通用”
打开
将始终成功。“智能”
打开
将忽略文件扩展名,并使用文件的来确定其类型,因此可能会成功。
file *.jpg | grep -v "JPEG image data" | sed 's/:.*//'