#!/usr/bin/env python3
import os
import imghdr
import shutil
import sys
directory = sys.argv[1]
for root, dirs, files in os.walk(directory):
for name in files:
file = root+"/"+name
# find files with the (incorrect) extension to rename
if name.endswith(".jpg"):
# find the correct extension
ftype = imghdr.what(file)
# rename the file
if ftype != None:
shutil.move(file, file.replace("jpg",ftype))
# in case it can't be determined, mention it in the output
else:
print("could not determine: "+file)
你可以在 bash 中相对容易地做到这一点:
这与@AB 的回答相同,但使用 shell globs 而不是
find
.${f%%.*}
是不带扩展名的文件名。该命令使它在文件名之后打印一个-0
,然后我们将其用于文件类型。这应该适用于任意文件名,包括那些包含空格、换行符或其他任何内容的文件名。这是获得小写扩展名的技巧。它会转换为.file
\0
grep
${type,,}
PNG
png
你没有在你的问题中说,但如果你需要它是递归的并进入子目录,你可以改用它:
这
shopt -s globstar
将启用 bash 的 globstar 选项,它可以**
匹配子目录:下面的脚本可用于(递归地)将错误设置的扩展名重命名为正确的扩展名
.jpg
。如果它发现一个不可读的文件,它会在脚本的输出中报告它。该脚本使用该
imghdr
模块来识别以下类型:rgb
,gif
,pbm
,pgm
,ppm
,tiff
,rast
,xbm
,jpeg
,bmp
,png
. 更多关于这里imghdr
的模块。如链接中所述,可以使用更多类型扩展该列表。实际上,如问题中所述,它专门重命名具有扩展名的文件
.jpg
。稍作改动,就可以将任何扩展名或一组特定的扩展名重命名为正确的扩展名(或没有扩展名,如此处)。剧本:
如何使用
rename.py
通过命令运行它:
注意:我的方法似乎太复杂了。我更喜欢 terdons 代替你的回答。
您可以使用命令
file
来确定文件类型:使用此信息,可以重命名文件:
请在将命令应用于图像之前进行测试
例子