Серия «Массовое конвертирование изображений в ubuntu»

Скрипт для массового выборочного конвертирования форматов файлов в Ubuntu, например, heic в jpg, вторая серия

Начало цифрового рукоблудия тут: Скрипт для массового выборочного конвертирования форматов файлов в Ubuntu, например, heic в jpg

Спасибо @Dristofor, который навеял мне мысль про более изящное решение.

В thunar можно добавлять кастомные пункты в контекстное меню (Правка - Особые действия), после чего путь к файлам, имена выделенных файлов и что там надо передаются в качестве параметров в программу обработчик. А еще есть комплект программ ImageMagick, где есть консольная команда convert, которая всякие форматы изображений конвертирует друг в друга с синтаксисом типа convert SOURCE RESULT. То есть, по итогу, задача - выцепить из параметров скрипта имена конвертируемых файлов без расширений, и с полным путем конвертировать их в файлы с теми же именами в новом формате. Причем, не перепиливая скрипт под новый формат каждый раз.

Реализация:

#!/bin/bash

#convertany.sh [result_format] [path] [filename1 filename2...]

#для использхования с imagemagick

i=1

for counter in "$@" #цикл с перебором параметров запуска скрипта

do

if [ ! $i -eq 1 ] && [ ! $i -eq 2 ] #дурацкое решение, ниже объясню

then

source="$2""/""${counter}"; #вылепить полное имя файла из 2-го параметра и имени файла

result="${source%.*}"".""${1}" #поменять расширение в полном имени на параметр 1

convert "$source" "$result" #конвертировать, собсна

fi

i=$((i+1));

done

Что все это значит:

Скрипт вызывается с параметрами: 1-желаемое расширение, в формат которого конверируется файл; 2- путь к конвертиируемым файлам; начиная с 3-го параметра - имена файлов в обрабатываемой папке. Все параметры прогоняются через цикл, в котором игнорируются 1 и 2 параметры, а из коротких имен файлов лепятся длинные имена с новым и старым расширением, которые подставляются в команду конвертера imagemagick. Почему-то условный переход на сравнение $counter $1 и $2 у меня не заработал, так что я засунул костыль ввиде счетчика, извинити. Изначально я хотел просто запрашивать пачку длинных имен файлов, но потом узнал, что длина командной строки в линухе ограничена 4кб, и выбрал вариант покороче.

Далее, скрипт у нас, конечно, помечен, как исполнимый, imagemagick установлен. Ковыряем настройки Особых действий в Thunar:

Скрипт для массового выборочного конвертирования форматов файлов в Ubuntu, например, heic в jpg, вторая серия Linux, Программирование, Linux mint, Командная оболочка bash, Конвертер, Длиннопост
Скрипт для массового выборочного конвертирования форматов файлов в Ubuntu, например, heic в jpg, вторая серия Linux, Программирование, Linux mint, Командная оболочка bash, Конвертер, Длиннопост

Соответственно, после имя_скрипта.sh и перед %d%N вписываем то расширение, для получения которого мы все это теребим. После заполнения всего этого в настройках, выбираем пачку файлов картинок (причем, можно разного формата), тыкаем в контекстном меню на свежевылупившийся пункт, получаем новые гифки или что там заказывали.

Ньюанс. Во-первых, ранние версии imagemagick (у меня 6-я) не умеют обрабатывать, например, .heic; что оно ест, можно узнать командой "convert -help". Далее, как я понимаю, в поздних версиях вместо convert пишут magick, соответственно, команду в скрипте надо поменять. Ну и, в моем случае, для обработки .heic`ов, нужен сторонний конвертер heif-convert из пакета libheif-examples; вписывается вместо "convert", работает с тем же синтаксисом, в настройках Особых действи тунара надо указать шаблон имени файла *.heic и Появляться, если содержит Другие файлы.

Как оно лепится к наутилусу, я без понятия, но - почти уверен - не сильно сложнее.

Показать полностью 2

Скрипт для массового выборочного конвертирования форматов файлов в Ubuntu, например, heic в jpg

UPD я улудшил Скрипт для массового выборочного конвертирования форматов файлов в Ubuntu, например, heic в jpg, вторая серия

В общем, у меня айфон и убунта. Не самое удобное сочетание, но, если ты однажды перешел на Линукс, значит - у тебя уже изначально предрасположенность к танцам с бубном вокруг компьютера. С помощью Warpinator'а перекидывание файлами с ноутбука на телефон и обратно наладилось, а после того, как в пыльном углу образовался nas-сервер из старого ноутбука - процесс стал непринужденным. Однако, выяснился ньюанс - фотки на гейфоне пишутся почему-то в странненьком формате .heic, а весь остальной мир предпочитает жпг. Причем, он выяснился, когда мне надо было заслать в налоговую два-три десятка фотогорафий документов. И онлайн-конвертеры почему-то адекватно при этом не работали. В общем. ВЫЗОВ ПРИНЯТ. За неадекватное для поставленной задачи время (чет типа полдня) было порождено решение в виде баш-скрипта:

#!/bin/bash

IFS=$'\n'

read -r -d '' -a array < <( xclip -selection clipboard -out && printf '\0' )

for element in "${array[@]}"

do

strlen=${#element} #дляна имени файла с расширением

pathlen=`expr $strlen - 4` #длина имени без последних 4 символов heic

path=`expr substr $element 1 $pathlen` #имя файла без расширения (первые "все - 4" символы)

jpg=$path"jpg" #прилепить новое расширение

heif-convert "$element" "$jpg" #тут можно вкорячить любой конвертер

done

Соответственно, для работы баш-скрипта нужны пакеты xclip и libheif-examples. Теперь - что вообще происходит: xclip - консольная утилита для работы с буфером обмена. heif-convert - команда из пакета libheif-examples, которая конветртирует файл из имя.хейф в имя.жпг. После того, как все пакеты установлены и вся лабуда скопипащена в файл скрипта с расширением .sh, который помечен, как исполнимый, делается следующее: в тунаре (кстати, не знаю, будет ли работать в наутилусе) выделяются подопытные файлы, копируются в буфер обмена. Далее, хоткеем или консолью запускается скрипт. Далее, оно делает копии скопированных в буфер файлов в новом формате с теми же именами в той же папке. Подробно: после копирования из тунара файлов в буфере оказывается кучка строк типа такого:

/home/username/123/IMG_0144.HEIC

/home/username/123/IMG_0145.HEIC

/home/username/123/IMG_0146.HEIC

первые 2 строки после бин-баш - чтение содержимого буфера обена в массив переменных, где каждая переменная - полное имя файла. Затем - перебор элементов массива (полных имен файлов), замена расширения на конце и впихивание "исходного_имени_и_расширения" и "конечного_имени_и_расширения" в непосредственно команду конвертера. Больше всего гемора было с поиском рабочего решения по чтению буфера в массив. Из плюсов получившегося поделия - с учетом распространенности в линухе консольных конвертеров файлов с синтаксисом типа КОНВЕРТЕР "ИЗ_ЭТОГО" "В_ЭТО", этот скрипт непринужденно может быть перепилен под любой подобный конвертер. Удобно же. Вроде.

Показать полностью
Отличная работа, все прочитано!