![在 Linux 中递归修复图像文件扩展名](https://linux22.com/image/1423372/%E5%9C%A8%20Linux%20%E4%B8%AD%E9%80%92%E5%BD%92%E4%BF%AE%E5%A4%8D%E5%9B%BE%E5%83%8F%E6%96%87%E4%BB%B6%E6%89%A9%E5%B1%95%E5%90%8D.png)
我有一堆来自错误命名的扫描/传真的图像文件,我需要为我们的 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 之前的代码,以便正确列出您的文件。此外,这旨在作为一个基本示例,说明如何开始自己完成这样的任务。我承认,通过复制和粘贴几乎肯定行不通。
通过亲自完成并实践实际解决方案,您将学到更多东西,而不是盲目地应用互联网上的代码。如果您仍然卡在这一点上,请随时发表评论,我会尽力提供帮助。