在 Linux 中递归修复图像文件扩展名

在 Linux 中递归修复图像文件扩展名

我有一堆来自错误命名的扫描/传真的图像文件,我需要为我们的 Linux 用户修复它们。结果发现我们有一堆 PNG 扫描文件,这些文件被标记为 *.jpg,反之亦然。在 Windows 下,这从来不是问题,因为 Explorer/Office 会忽略扩展名。但在 Linux 下,Eye of GNOME 等最终会拒绝打开文件,因为内容与扩展名不匹配。

有人能推荐一个工具或一段小脚本来做这个吗?我可以写一个 C 程序来做这个,但这似乎有点过头了。坐下来手动重命名不是一个选择,有成千上万个。

编辑:我看到该file命令将查看文件的实际内容并显示它是什么。但我不太清楚如何使用其中的信息。

答案1

您需要迭代看起来像图像文件的文件,调用它file来查看它们的真实内容,然后对其进行适当的重命名

shopt -s nullglob    # in case no image files in PWD

for f in *.{jpg,JPG,png,PNG,jpeg,JPEG}; do 
    type=$( file "$f" | grep -oP '\w+(?= image data)' )
    case $type in  
        PNG)  newext=png ;; 
        JPEG) newext=jpg ;; 
        *)    echo "??? what is this: $f"; continue ;; 
    esac
    ext=${f##*.}   # remove everything up to and including the last dot
    if [[ $ext != $newext ]]; then
        # remove "echo" if you're satisfied it's working
        echo mv "$f" "${f%.*}.$newext"
    fi
done

答案2

ls | grep "png" | awk 'BEGIN{FS="\."}{print $1".png " $1".jpg"}'|xargs mv

.显然,您必须更改 awk 之前的第一部分才能找到您的 png 文件。如果路径中有多个文件,则此方法无效。

这可能不是立即适用于您的特定情况的解决方案,但其中包含了您需要的所有部分。如果您提供更多详细信息,或者最好提供一份需要更改的所有文件的打印列表,那么我可以更改命令以完全适合您。

编辑#1:我没有意识到他需要检查文件内容才能知道哪些是错误的,我以为他知道错误命名的文件列表。

编辑 #2:评论者似乎对 awk 之前的代码部分很着迷。我以为我的第一句话已经足够清楚了,但事实并非如此;您必须提供 awk 之前的代码,以便正确列出您的文件。此外,这旨在作为一个基本示例,说明如何开始自己完成这样的任务。我承认,通过复制和粘贴几乎肯定行不通。

通过亲自完成并实践实际解决方案,您将学到更多东西,而不是盲目地应用互联网上的代码。如果您仍然卡在这一点上,请随时发表评论,我会尽力提供帮助。

相关内容