У меня есть большое количество изображений, которые я скопировал с провального внешнего жесткого диска. Все изображения прекрасны и не имеют никакого повреждения, но странно большое количество их теперь пропускает расширения. Файлы являются соединением jpg, png, и gif, и названы в следующей структуре, всех в единственной папке.
1
2
3
4.jpg
5.png
etc
Некоторые файлы имеют расширения, в то время как многие не делают и являются просто числами. В этой папке существует примерно 4 000 изображений, таким образом, вручную переименование не является опцией.
Есть ли какой-либо сценарий или программа, которая может использоваться, чтобы определить расширение через метаданные и добавить его к файлам по мере необходимости?
Я использовал "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"
- строка и выполните его командой:
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
команда делает) разрабатывать то, что файл, и затем добавлять первый дополнительный MimeInfo имеет для что тип MIME назад на файл.
В некоторых случаях это может привести к реже используемым используемым расширениям (как 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/);
(находящий тип файла)найдите расширение каждого $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"
и запущенный скрипт снова и любят переименовывать ;)