帮酷LOGO
0 0 评论
  • 显示原文与译文双语对照的内容
文章标签:重命名  类型  批量重命名  scripts  图像  bat  type  batch  

问题:

我有大量的图片,我从一个失败的外部硬盘复制。 所有的图像都很好,没有损坏,但是很奇怪的是,它们现在缺少扩展。 这些文件是 jpg。png和gif的混合,并以下面的结构命名,全部位于单个文件夹中。


1


2


3


4.jpg


5.png



etc



有些文件有扩展名,而许多文件没有扩展名,而只是数字。 文件夹中有大约 4000个图像,因此手动重命名不是一个选项。

是否有可以通过元数据确定扩展名并根据需要将它的添加到文件中的脚本或者程序?

我已经从软件中心使用了"pyrenamer"多年来重命名文件,但它似乎无法添加扩展。

任何帮助都会极大地感谢我的编码,我不能自己解决。


回答 1:

在 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中的图片并通过命令运行它:


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)




回答 2:

使用 rename 命令的一个接口:


rename 's/.*/use File::MimeInfo::Magic qw#mimetype extensions#; sprintf("%s.%s", $&, extensions(mimetype($&)))/e' * -vn



它使用 Perl File::MimeInfo 模块查询文件(。file 命令的执行方式) 以查找文件的内容,然后追加第一个扩展 MimeInfo。

在某些情况下,这可能会导致使用( 像jpeg或者 jpe,大多数人将命名jpg文件)的通用扩展更少,但是你可以通过第二步更轻松地纠正它们:


rename 's/.jpe$/.jpg/' *



但是大多数应用程序如果指定. jpe 文件,则不会介意,所以大多数时候都不需要这样做。

上面的rename 命令都是在测试模式下设置的。
他们不会做任何事情,直到你从末尾移除 -n 参数。


回答 3:

简单脚本


#!/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/); ( 查找文件类型)

使用 file ( 确定文件类型) 命令查找每个 $file的扩展。

--mime-type, --mime-encoding 选项用于仅打印指定的element(s)。

用于不将文件名附加到输出行( 简短模式)的-b, --brief 选项。
更多信息请参见 man文件

现在我们提取了文件类型并将它的保存到 TYPE 变量中。

and cut -f2 -d/ 命令? 用于仅打印扩展类型,如 image/png 输出中的pngfile --mime-type -b"$file" 结果。

-f2 在字段之间用 / 分隔符( -d 选项) 打印第二部分。 示例:在 image/png 中打印 png。 更多信息请参见 man cut

if [[...]];的解释( 检查文件扩展名)

使用一个简单的正规表达式 跳过所有现有扩展,如果条件条件中的[[...]] 测试中使用 =~ 运算符,则使用运算符:


if [[ $file =~. $TYPE ]];



$file 是你的图像文件名,$TYPE 是它的扩展名,我们找到并存储到 TYPE 变量中 TYPE=$(file --mime-type -b"$file" | cut -f2 -d/);

然后我们跳过重命名所有具有扩展名的文件。

引用:如果文件没有扩展名,那么重命名它并在它的名称的末尾添加扩展名。!

解释 echo mv -v"$file""$file.$TYPE"; ( 重命名步骤)

实际上,我们在 $file 文件的末尾使用 mv 命令附加了文件扩展名( 如果 $file 本身没有扩展名)。 mv 还用于重命名文件/目录。

然后将 $file 重命名为 $file.$TYPE。 例如如果文件 1的文件类型为 png 格式,则将它的重命名为 1.png


in theory actually 上面 mv command do this: rename filename -> filename.filetype



存储在 $file 变量中的文件名存储在 $TYPE 变量中。

如何使用这里脚本?

复制并粘贴 gedit 中的脚本,并将它的保存为你喜欢的名称: batchRename,然后打开终端并通过以下命令运行它:


bash batchRename



在运行脚本之前,不要忘记在使用 echo 命令检查结果时验证正确的图像路径 /path/to/images/,并在检查结果后删除 echoecho mv -v"$file""$file.$TYPE" 再次运行脚本,并享受重命名;)




文章标签:图像  type  scripts  类型  bat  batch  重命名  批量重命名  

Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语