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

GNU/Linux

1K постов15.5K подписчиков

Добавить пост

Правила сообщества

Все дистрибутивы хороши.

Будьте людьми.

10
Автор поста оценил этот комментарий

Меняешь на телефоне формат с Супермупер на Станлартный или как то там оно наподобие называется. И все. А ваще я этот heic иногда тупо в джипег переименовывао и все.  Не всегда, но срабатывапет, что подтверждает фуфловость этого хайка.

раскрыть ветку (1)
4
Автор поста оценил этот комментарий

Разрешите побыть душным критиканом, но:


#. Вместо массива можно использовать 'while read' конструкции:

while read element; do
done <<( xclip -selection clipboard -out )

Кстати если будете использовать, то учтите нюансик - "| while read" запирает переменные в контексте цикла, когда "while read; do; done <<" уже нет.


#. BASH умеет "убирать последние 4 символа из переменной" уже давно.

jpg="${element::-4}jpg"

Бонусом - часто файловые менеджеры умеют "кинь меня на скрипт чтобы запустить с путем до файлов в переменных". При этом "$@" (именно в кавычках) сохранит аргументы "как было", что актуально когда есть проблемы в путях. И если скормить это printf, то можно сформировать многострочник для пайпа.

printf "%s\n" "$@"
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

на осмысление прочитанного у меня уйдет еще полдня; спасиба

1
Автор поста оценил этот комментарий
Он пишет heic не потому, что странненько, а потому, что в heic еще пишется инфа о глубине резкости и прочие эти Live Photo
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

я не подразумеваю, что .хейк - это что-то плохое

2
Автор поста оценил этот комментарий

да (настройки/камера/форматы) + в настройках фото есть фишка "переносить на комп в совместимом формате" но я так понимаю это работает только на винде и маке

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

гугл подсказывает, что можно настроить сохранять непосредственно в жпеге, но я пока не пробовал

показать ответы
Автор поста оценил этот комментарий

где ты был десять часов назад ,я заебался сканировать и переименовывать

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

допиливал этот скрипт))

Автор поста оценил этот комментарий

Ну так замените в скрипте convert на heif-convert и будет счастье.

У меня версия imagemagick 7.1 с HEIC успешно работает, к слову.

раскрыть ветку (1)
2
Автор поста оценил этот комментарий

> Тут конвертится именно та пачка, которую накликал мышью.


Тогда я бы сделал так, а именно добавил пункт в конекстное меню любимого файлового менеджера:

https://askubuntu.com/questions/719262/how-do-i-add-custom-i...


Если хочется работать мышкой, то почему бы и последний этап не делать мышкой?

раскрыть ветку (1)
Автор поста оценил этот комментарий

Запилил я, значит, новый скрипт под работу из контекстного меню. Решил прилепить туда ImageMagick. А оно в 6 версии .HEIC не умеет конвертить. Господа. Вы меня цинично обманули. Я огорчен.

показать ответы
2
Автор поста оценил этот комментарий

> Тут конвертится именно та пачка, которую накликал мышью.


Тогда я бы сделал так, а именно добавил пункт в конекстное меню любимого файлового менеджера:

https://askubuntu.com/questions/719262/how-do-i-add-custom-i...


Если хочется работать мышкой, то почему бы и последний этап не делать мышкой?

раскрыть ветку (1)
Автор поста оценил этот комментарий

Годный совет; в любом случае, кмк, выбирать файлы мышью прям сильно удобнее, чем вбивать их с клавиатуры

1
Автор поста оценил этот комментарий

Там есть ещё более модная команда mogrify, которая всё делает в одну строчку, если обработка идёт по директориям:


mogrify -format jpg *.heic

раскрыть ветку (1)
Автор поста оценил этот комментарий

Это да, это все могут, даже если не хотят (в том смысле, что вывод ls можно засунуть в массив и делать с этим всякое, О ДА). Тут конвертится именно та пачка, которую накликал мышью.

показать ответы
Автор поста оценил этот комментарий

Эмм, мне кажется или вы "изобрели" команду convert из пакета ImageMagick?

раскрыть ветку (1)
Автор поста оценил этот комментарий

Второй раз уже перечитал инструкцию к команде; не заметил, чтобы она делала то, о чем речь в посте. Но, воспользовавшись скриптом из поста, можно научить.

Автор поста оценил этот комментарий

А так ваш скрипт это просто клпипаста. Он гуглится.

раскрыть ветку (1)
Автор поста оценил этот комментарий

ссыль кинь или твой рот гуглится

Автор поста оценил этот комментарий
Иллюстрация к комментарию
раскрыть ветку (1)
Автор поста оценил этот комментарий

Да. Уже видел.

2
Автор поста оценил этот комментарий

Понятно, что вы наслаждаетесь собственным творчеством)

раскрыть ветку (1)
Автор поста оценил этот комментарий

публично)

показать ответы
Автор поста оценил этот комментарий

ну так я же как чел выше написали - настройки/камера/форматы

раскрыть ветку (1)
Автор поста оценил этот комментарий

То есть, он в себя будет все равно странненькое писать? Надо потрогать в общем.

показать ответы
1
Автор поста оценил этот комментарий

Нет не типа.

Это универсальный инструмент не требующий сторонних библиотек и работающий с любыми форматами.


Кроме того ваш скрипт упадет если случайно попадется не тот файл)

раскрыть ветку (1)
Автор поста оценил этот комментарий

Он просто не конвертирует конкретно этот файл, больше ничего не происходит, проверял. Универсальный инструмент тоже надо установить (из коробки на дистре я его что-то не наблюдаю). Просто у нас разные инструменты. Возможно, ваш больше. Возможно, мой тоньше. Оба по-своему удобны.

показать ответы
Автор поста оценил этот комментарий

XnView MP

Из чего угодно во что угодно.

Пакетная обработка файлов от смены форматов до коррекции размеров и ретуши.

раскрыть ветку (1)
Автор поста оценил этот комментарий

Чет типа эйсидиси (не музыкантов) из моего детства. Не совсем то. Тут кнопку "пыньк" - и у тебя пачка новых фалов, без лазанья по сторонним гуям. Если, кончено, месье такое заинтересует...

показать ответы
5
Автор поста оценил этот комментарий

А чем универсальный convert из imagemagick плох?

раскрыть ветку (1)
Автор поста оценил этот комментарий

Ничем, просто он не вывалился первым в поисковой выдаче при поиске конвертера. Не вижу препятствий перепилить скрипт под него. Или под нее.

Автор поста оценил этот комментарий

В xnview кнопочка Пакетная обработка. Галки расставил и понеслась.

В дистре да, его нет. А во флэтпаках есть. Тем более пакеты из флэтпаков сейчас обновляются тем же самым Менеджером обновлений, что и обычные.

раскрыть ветку (1)
Автор поста оценил этот комментарий

Не пробовал. Звучит неплохо. Обычно это что-то типа "запустил прогу-открыл в ней браузер-натыкал файлы-нажал кнопку-нажал кнопку и еще кнопку". Не особо медленнее, чем с моим костылем, но универсальнее. Так-то меня изначально и онлайн-конвертер устраивал, но что-то пошло не так...