LINUX.ORG.RU

Ответ на: комментарий от legolegs

надёжнее так

Боюсь, что ТСу надо было б объяснить, где была ошибка у того предыдущего комента. Вот вы точно знаете?

А если не быть голословным, то вот такое в конечном итоге, наверное, таки будет быстрее, но не уверен:

#!/bin/bash
declare -A D

for i; do
        d=$(dirname "$i")
        if [ -z "${D[$d]}" ]; then
                D[$d]=1
                mkdir -p "$d"/_png
        fi
done

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 2)
Ответ на: комментарий от vodz

Боюсь, что ТСу надо было б объяснить, где была ошибка у того предыдущего комента

Неаккуратные кавычки, а -p для mkdir я добавил, чтобы исключить жалобы на уже существующую выходную директорию при повторном запуске.

Ваше решение, если оно делает то, что я думаю (не пытается создавать директории дважды) мне видится переусложнённым. У нас N файлов и K (сильно меньше N) директорий. N файлов всё равно будут записаны и создадут нагрузку на IO, там зачем нам оптимизировать по K?

legolegs ★★★★★
()
Последнее исправление: legolegs (всего исправлений: 1)
Ответ на: комментарий от legolegs

Неаккуратные кавычки

Я так и думал, что вы не знаете. Кавычки были аккуратные, их просто не хватало у аргумента для mkdir. В присваивании к d=  — они правильные.

сильно меньше N директорий

Вот именно, раз директорий не больше, а в реальности сильно меньше, то и создавать их на каждый файл — пустая трата ресурсов. Ведь mkdir не встроенная команда shell-а, а это значить: fork+сискол mkdir, а следовательно, напрашивается для вполне закономерной оптимизации. Насчёт IO стоит учесть, что каталоги и файлы будут писаться в разные блоки файловой системы, то есть и последовательного обращения к диску не будет.

vodz ★★★★★
()
Ответ на: комментарий от vodz

Я так и думал, что вы не знаете

вонка.жпг

создавать их на каждый файл — пустая трата ресурсов

1) преждевременная оптимизация - корень всех зол

2) воддерживает ли .desktop в меню по ПКМ множество файлов - вообще вопрос. $@ мы тут не используем. А вот пожмякать кнопку несколько раз пользователь точно может и это должно происходить без лишних сбоев и ругани в .xsession-errors (там и без того помойка, впрочем), отсюда маленький скромный ключик -p.

legolegs ★★★★★
()
Последнее исправление: legolegs (всего исправлений: 1)
Ответ на: комментарий от legolegs

преждевременная оптимизация - корень всех зол

Видите ли, это истина только тогда, когда высказавший это может доказать, что она преждевременная. На всякий случай я напоминаю, что ключевое слово во встроенности mkdir, на сишке нет смысла проверять stat(«dir») if(!exist) mkdir(«dir»), это уже будет бесполезной тратой ресурсов, а вот на bash это выльется в fork+ exec(«mkdir»)+mkdir(«dir») на каждый файл. А впрочем, боюсь такие высокие материи для вашего понимания недоступны...

воддерживает ли .desktop в меню по ПКМ

Это по каковски? Выплюньте каку и говорите по нормальному. Даже читать дальше не стал.

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 2)
Ответ на: комментарий от vodz

ОК, давайте оптимизируем вот то, что уже работает:

#!/bin/bash
mkdir -p "$(dirname "$1")"/_jpg
gm convert "$1" "${1%%png}jpg"
mv "${1%%png}jpg" "$(dirname "$1")"/_jpg

Этот скрипт на Правой Кнопке Мышки. То есть выделил 100 объектов и этот скрипт будет 100 раз создавать папку. На практике не вижу никаких проблем. Ничего не летит в .xsession-errors

abbat81 ★★
() автор топика
Ответ на: комментарий от abbat81

давайте оптимизируем вот то

А зачем вы так дубово вставили код legolegs-а? Ведь явно же напрашивается, что раз вам что-то нужно в нескольких местах, то для этого и предназначены переменные. Ну и для bash, где встроенная команда test/'['/'[[', лучше обернуть проверку наличия, чем вызывать mkdir всегда.

vodz ★★★★★
()
Ответ на: комментарий от vodz

Что бы не оставить после себя голословную отписку, поясню, что три строки в приведенном коде лучше, чем бубны с переменными. Тоже касается ненужной проверки наличия, если сама mkdir уже предусматривает параметр "-p", процитирую: «no error if existing, make parent directories as needed»

no error if existing, Карл...

abbat81 ★★
() автор топика
Ответ на: комментарий от abbat81

На самом деле если почитать man gm и доки на .desktop то выясняется, что всё уже украдено до нас:

.desktop

Exec=gm mogrify -create-directories -output-directory _jpg/ -format jpg %F

.sh файл не нужен, хотя можно и с ним. %F отличается от %f тем, что раскрывается в список всех выделенных файлов, т.е. GraphicMagic вызывается один раз на клик, даже если много файлов выделено, и всё обрабатывает.

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

Очень хорошее замечание. Особенно в ограничении запуска gm одним процессом. Только в приведенном коде создается папка _jpg/ а в ней рекурсивно папки начиная с home.

abbat81 ★★
() автор топика
Ответ на: комментарий от abbat81

три строки в приведенном коде лучше, чем бубны с переменными.

Чушь. Как же у вас мозги то повернуты, что истина ну ровно наоборот! Переменная не сколько ускоряет код (в данном случае - существенно, так как $() - это сопроцесс), сколько заметно улучшает читабельность и сопровождаемость. Кто будет (да даже вы через 5 лет) это читать, тот сразу заметит что a) каталог имеет одно и тоже имя в нескольких командах, так как берётся из одной переменной, б) «$d» намного читабельнее, чем «$(dirname »$1")«/_jpg .

no error if existing, Карл...

Я боюсь, Карл, что вот это Создать директорию рядом с файлом (комментарий) вам тем более бесполезно разъяснять. Примите как данность.

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от abbat81

Нда. Непонятно, о каком юзкейзе думали авторы графикмэджик, но опции -output-directory и -path одинаково бесполезны, если пути абсолютные, а они будут абсолютными и иногда, даже, могут быть из разных директорий (если конвертировать из результатов поиска или ещё в dolphin есть древовидный режим, не знаю что там в гноме нынче).

png2jpg.sh:

#!/bin/bash
mkdir -p "$(dirname "$1")"/_jpg
gm convert "$1" "$(dirname "$1")/_jpg/$(basename "${1%%png}jpg")"

или (коллега vodz в чём-то прав)

#!/bin/bash
OUTDIR=$(dirname "$1")/_jpg
FILE=$(basename "$1")
OUTFILE=${FILE%%[pP][nN][gG]}jpg
[ -d "$OUTDIR" ] || mkdir "$OUTDIR"
gm convert "$1" "$OUTDIR/$OUTFILE"

png2jpg.desktop может быть сделан двумя способами

простой (может положить машину, если выделить сразу тыщу файлов):

...
Exec=~/png2jpg.sh %f
сложный (запускает процессы по числу ядер)
...
Exec=parallel ~/png2jpg.sh ::: %F

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

Думаю, самым лучшим решением будет отказаться от директорий в пользу перезаписи или создания рядом нужного формата. Это связано с тем, что я повесил свой комп выделив 100 шт. файлов. Диспетчер задач успел мне показать множество sh. Конечно хотелось бы знать, когда закончится та обработка Типа:

Exec=gm mogrify -format jpg %F && notify-send -u critical  "Готово!";
Но мир небезупречен, так не работает...

abbat81 ★★
() автор топика
Последнее исправление: abbat81 (всего исправлений: 1)
Ответ на: комментарий от legolegs
OUTDIR=$(dirname "$1")/_jpg
FILE=$(basename "$1")
OUTFILE=${FILE%%[pP][nN][gG]}jpg
[ -d "$OUTDIR" ] || mkdir "$OUTDIR"
gm convert "$1" "$OUTDIR/$OUTFILE"

Оптимизировать так оптимизировать: :))

OUTDIR=${1%%/*}
[[ "$OUTDIR" == "$1" ]] && OUTDIR=./_jpg || OUTDIR+=/_jpg
[ -d "$OUTDIR" ] || mkdir "$OUTDIR"
FILE=${1##*/}
gm convert "$1" "$OUTDIR/${FILE/%[Pp][Nn][Gg]/jpg}"
Да, да, самое последнее слово ${par/pat/chg} — башизм на пустом месте, но наверное на микросекунды быстрее. :)

vodz ★★★★★
()
Ответ на: комментарий от abbat81

Поставь GNU parallel и используй второй вариант. parallel рулез.

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

А я ничего не оптимизировал, я читаемость повышал.

А я говорил, что у вас получилось плохо? Там куча смайликов стояла, в данном случае это как раз означало: оптимизация ради оптимизации, любой ценой, в том числе потерей читабельности. :)

vodz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.