正确的文件扩展名

正确的文件扩展名

我有大约 12000 张不同文件类型的图像,但每个都被重命名为 *.jpg。

现在我想把他们原来的扩展名还给他们,我该怎么做

答案1

您可以在 bash 中相对轻松地完成此操作:

for f in *jpg; do 
    type=$(file -0 -F" " "$f" | grep -aPo '\0\s*\K\S+') 
    mv "$f" "${f%%.*}.${type,,}"  
done

这与 @AB 的答案的想法相同,但使用 shell 通配符而不是find${f%%.*}是文件名,不带扩展名。命令-0file使其\0在文件名后打印一个,然后我们将其用于grep文件类型。 这应该适用于任意文件名,包括包含空格、换行符或其他任何内容的文件名。 是${type,,}获取小写扩展名的技巧。 它会转换PNGpng

你没有在问题中说,但如果你需要这个递归并进入子目录,你可以使用这个:

shopt -s globstar
for f in **/*jpg; do 
    type=$(file -0 -F" " "$f" | grep -aPo '\0\s*\K\S+') 
    mv "$f" "${f%%.*}.${type,,}"  
done

shopt -s globstar将启用 bash 的 globstar 选项,允许**匹配子目录:

全球星

如果设置,路径名扩展上下文中使用的模式 ** 将匹配所有文件以及零个或多个目录和子目录。如果模式后跟 /,则仅匹配目录和子目录。

答案2

下面的脚本可用于(递归地)将错误设置的扩展名 重命名.jpg为正确的扩展名。如果发现无法读取的文件,它会在脚本的输出中报告。

该脚本使用模块来识别imghdr以下类型:rgb,,,,,,,,,,,。有关模块的gif更多信息pbmpgmppmtiffrastxbmjpegbmppngimghdr这里。该列表可以扩展更多类型,如链接中所述。

事实上,它专门重命名带有扩展名的文件.jpg,如问题中所述。只需稍加修改,就可以将任何扩展名或特定扩展名集重命名为正确的扩展名(或不带扩展名,例如这里)。

剧本:

#!/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)

如何使用

  1. 将脚本复制到一个空文件中,另存为rename.py
  2. 通过命令运行:

    python3 /path/to/rename.py <directory>
    

答案3

注意:我的方法似乎太复杂了。我更希望 terdons 能代替你回答。


您可以使用以下命令file来确定文件类型:

% file 20050101_14-24-37_330.jpg 
20050101_14-24-37_330.jpg: JPEG image data, EXIF standard 2.2, baseline, precision 8, 1200x1600, frames 3

% file test.jpg
test.jpg: PNG image data, 1192 x 774, 8-bit/color RGBA, non-interlaced

利用这些信息,可以重命名文件:

在将命令应用于图像之前,请先进行测试

find . -type f -iname "*.jpg" -print0 | xargs -0 -I{} file -F"<separator>" {} | 
 awk -F " image data" '{print $1}' | 
  awk -F"<separator> " '{
   system("mv \""$1"\" $(dirname \""$1"\")/$(basename -s .jpg \"" $1 "\")."$2)
   }'

例子

% find . -type f -name "*.jpg"
./test.jpg
./sub/20050101_14-24-37_330.jpg

% find . -type f -iname "*.jpg" -print0 | xargs -0 -I{} file -F"<separator>" {} | awk -F " image data" '{print $1}' | awk -F"<separator> " '{system ("mv \""$1"\" $(dirname \""$1"\")/$(basename -s .jpg \"" $1 "\")."$2)}'

% find . -type f -iname "*"    
./test.PNG
./sub/20050101_14-24-37_330.JPEG

相关内容