Пакет переименовывает — типы повторного изображения

У меня есть большое количество изображений, которые я скопировал с провального внешнего жесткого диска. Все изображения прекрасны и не имеют никакого повреждения, но странно большое количество их теперь пропускает расширения. Файлы являются соединением jpg, png, и gif, и названы в следующей структуре, всех в единственной папке.

1
2
3
4.jpg
5.png

etc

Некоторые файлы имеют расширения, в то время как многие не делают и являются просто числами. В этой папке существует примерно 4 000 изображений, таким образом, вручную переименование не является опцией.

Есть ли какой-либо сценарий или программа, которая может использоваться, чтобы определить расширение через метаданные и добавить его к файлам по мере необходимости?

Я использовал "pyrenamer" от центра программного обеспечения в течение многих лет для переименования файлов, но это, кажется, не может добавить расширения.

Любая справка значительно ценилась бы, мое кодирование сосет, и я не могу понять это самостоятельно.

2
задан 20 October 2014 в 12:47

3 ответа

Ниже решения для 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" - строка и выполните его командой:

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)
4
ответ дан 19 November 2019 в 00:47

Острота с помощью rename команда:

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

это использует Perl File::MimeInfo модуль для запросов файла (вид как file команда делает) разрабатывать то, что файл, и затем добавлять первый дополнительный MimeInfo имеет для что тип MIME назад на файл.

В некоторых случаях это может привести к реже используемым используемым расширениям (как jpeg или jpe для того, что большинство людей назвало бы jpg файлами), но можно сделать вторую передачу для исправления их довольно легко:

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

Но большинство приложений не будет возражать при определении .jpe файлов, таким образом, это не необходимо большую часть времени.

Оба rename команды выше установлены в тестовом режиме.
Они ничего не сделают, пока Вы не удалите -n аргумент от конца.

2
ответ дан 2 December 2019 в 01:33

Простой сценарий

#!/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 опция, используемая для печати только указанный элемент (элементы).

-b, --brief опция, используемая для, не предварительно ожидает имена файлов для вывода строк (краткий режим).
См. также файл человека для большего количества информации.

Теперь мы извлекли тип файла и сохранили его в TYPE переменная.

И что cut -f2 -d/ команда? Используемый для печати просто дополнительного типа, Как png в image/png вывод от file --mime-type -b "$file" результат.

-f2 печать вторая часть с / разделитель (-d опция) между полями. исключая:Печать png в image/png. См. также сокращение человека для большего количества информации.

Объяснение if [[...]]; (проверка расширения файла)

Мы пропустили все существующее расширение с простым regex, с помощью =~ оператор внутри a [[...]] тест, в если условие:

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

В то время как $file Ваши имена файлов изображений и $TYPE его расширение, которое мы нашли и сохранили это в TYPE переменная в TYPE=$(file --mime-type -b "$file" | cut -f2 -d/);.

Затем мы пропускаем для переименования всех файлов, который имеет расширение с собой.

! обратитесь к: если файл не имеет НИКАКОГО расширения с собой, то переименуйте это и добавьте его расширение в конце его имени.

Объяснение echo mv -v "$file" "$file.$TYPE";(переименуйте шаг),

В этой строке На самом деле мы добавляем расширение файла (если $file не делает расширения с собой) в конце $file файл при помощи mv команда. mv также с помощью для переименования Файлов/Каталога.

Затем мы переименовываем $file кому: $file.$TYPE. Например, файл 1 будет переименовывают к 1.png если его тип файла был png формат.

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

То имя файла, сохраненное в $file переменная и тип файла, сохраненный в $TYPE переменная.

Как можно использовать этот сценарий?

Скопируйте и вставьте сценарий в gedit и сохраните его со своим любимым именем исключая: batchRename, затем откройте Terminal и выполните его следующей командой:

bash batchRename

Не забывайте прежде, чем запустить скрипт, проверяют Ваш путь правильных образов /path/to/images/ и для переименования на Ваших файлах после проверки результата с echo управляйте, удалите echo с начала echo mv -v "$file" "$file.$TYPE" и запущенный скрипт снова и любят переименовывать ;)

2
ответ дан 2 December 2019 в 01:33

Другие вопросы по тегам:

Похожие вопросы: