批量重命名 – 多种图像类型
我从失败的外部硬盘驱动器复制了大量图像。 所有的图像都很好并且没有损坏,但奇怪的是它们中的大量现在都缺少扩展。 这些文件是jpg,png和gif的混合,并在以下结构中命名,都在一个文件夹中。
1 2 3 4.jpg 5.png etc
有些文件有扩展名,而有些文件没有,只是数字。 此文件夹中大约有4000个图像,因此不能手动重命名。
是否有任何脚本或程序可用于通过元数据确定扩展名并根据需要将其添加到文件中?
我多年来一直使用软件中心的“pyrenamer”重命名文件,但它似乎无法添加扩展名。
任何帮助将不胜感激,我的编码很糟糕,我无法自己解决。
下面是一个python解决方案(脚本)。
该脚本使用imghdr模块识别文件类型。 它将添加以下类型的正确文件扩展名(如果缺少):
rgb, gif, pbm, pgm, ppm, tiff, rast, xbm, jpeg, bmp, png
如果文件已有文件扩展名,则会跳过该文件。 如果文件是未知文件类型(例如,如果它已损坏),则报告文件为“无法确定”:
could not determine: /home/jacob/Bureaublad/picturetest/blub
剧本:
#!/usr/bin/env python3 import os import imghdr import shutil directory = "/path/to/pictures" for name in os.listdir(directory): # combining file+its directory: file = directory+"/"+name # only files without a dot are subject to renaming (else the file already has a file extension or is a hidden file): if name.count(".") == 0: # fetch the file extension from the file: ftype = imghdr.what(file) # if it is impossible to get the extension (if the file is damaged for example), the file(s) will be listed in the terminal window: if ftype != None: shutil.move(file, file+"."+ftype) else: print("could not determine: "+file)
将其粘贴到一个空文件中,将其保存为rename.py,将目录设置为directory = "/path/to/pictures"
-line中的directory = "/path/to/pictures"
,然后通过以下命令运行它:
python3 /path/to/rename.py
递归重命名
如果您的图像不在“平面”目录中,而是在分层目录中,请使用下面的版本。 它将在文件的当前文件夹中检查(并在必要时修复)文件扩展名。
#!/usr/bin/env python3 import os import imghdr import shutil directory = "/path/to/pictures" for root, dirs, files in os.walk(directory): for name in files: file = root+"/"+name if name.count(".") == 0: ftype = imghdr.what(file) if ftype != None: shutil.move(file, file+"."+ftype) else: print("could not determine: "+file)
使用rename
命令的单行:
rename 's/.*/use File::MimeInfo::Magic qw#mimetype extensions#; sprintf("%s.%s", $&, extensions(mimetype($&)))/e' * -vn
它使用Perl File::MimeInfo
模块查询文件( file
命令的工作方式)来确定文件是什么,然后将该MIME类型的第一个扩展名MimeInfo附加到文件中。
在某些情况下,这可能导致使用较少使用的扩展(如jpeg或jpe,大多数人都会将jpg文件命名),但是你可以做第二遍来很容易地纠正这些:
rename 's/\.jpe$/.jpg/' *
但是,如果指定.jpe文件,大多数应用程序都不介意,因此大多数情况下这不是必需的。
上述两个rename
命令都在测试模式下设置。
在从末尾删除-n
参数之前,它们不会执行任何操作。
简单的脚本
#!/bin/bash for file in ~/path/to/images/*; do TYPE=$(file --mime-type -b "$file" | cut -f2 -d/); if [[ ! $file =~ \.$TYPE ]]; then echo mv -v "$file" "$file.$TYPE"; fi done
TYPE=$(file --mime-type -b "$file" | cut -f2 -d/);
解释TYPE=$(file --mime-type -b "$file" | cut -f2 -d/);
(查找文件类型)
使用file
(确定文件类型)命令查找每个$file
的扩展名。
--mime-type, --mime-encoding
选项,用于仅打印指定的元素。
-b, --brief
用于不将文件名添加到输出行的简单选项(简短模式)。
有关详细信息,另请参阅man文件 。
现在我们提取文件类型并将其保存到TYPE
变量中。
什么是cut -f2 -d/
command? 这用于打印扩展类型,如文件中的png
image/png
输出file --mime-type -b "$file"
结果。
-f2
在字段之间使用/
delimiter( -d
选项)打印第二部分。 例如:在image/png
打印image/png
。 另见man cut以获取更多信息。
if [[...]];
(检查文件扩展名)
我们使用简单的正则表达式跳过了所有现有的扩展,在if条件下使用[[...]]
测试中的=~
运算符:
if [[ $file =~ \.$TYPE ]];
虽然$file
是你的图像文件名, $TYPE
是我们在TYPE=$(file --mime-type -b "$file" | cut -f2 -d/);
找到并存储到TYPE
变量中的扩展名TYPE=$(file --mime-type -b "$file" | cut -f2 -d/);
。
然后我们跳过重命名所有具有扩展名的文件。
!
请参阅:如果文件没有自身的扩展名,则重命名该文件并在其名称的末尾添加其扩展名。
echo mv -v "$file" "$file.$TYPE";
(重命名步骤)
在这一行实际上我们使用mv
命令在$file
文件的末尾附加文件扩展名(如果$file
不是自己的扩展名)。 mv
还用于重命名文件/目录。
然后我们将$file
重命名$file
$file.$TYPE
。 例如,如果文件类型为png
格式,则文件1
将重命名为1.png
。
in theory actually above mv command do this: rename filename -> filename.filetype
该文件名存储在$file
变量中,filetype存入$TYPE
变量。
你怎么用这个脚本?
将脚本复制并粘贴到gedit
并使用您喜欢的名称ex: batchRename
,然后打开终端并通过以下命令运行它:
bash batchRename
在运行脚本之前,请不要忘记validation正确的映像路径/path/to/images/
并在使用echo
命令检查结果后重命名文件,从echo mv -v "$file" "$file.$TYPE"
删除echo
echo mv -v "$file" "$file.$TYPE"
并再次运行脚本并享受重命名;)