LINUX.ORG.RU

[shell] convert, подкаталоги, сохранение путей

 


0

1

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

Т.е. надо из ./dir/pic1/Aa/picture.png получить ./new_dir/pic1/Aa/picture.jpg и так по всему содержимому dir.

У кого какие идеи здесь?

★★★★★

find dir -type f -name '*.png' -exec sh -c 'f={}; mkdir -p $f; rmdir $f; convert $f /new_dir/$f.jpg' \;

За правильность и пробелы в именах не отвечаю.

sdio ★★★★★
()

предлагаю ещё тупее, без вот этих вот изысков и прочего эстетства: 1. копируем каталог 2. внутри нового каталога конвертим изображения и удаляем исходник после конвертации. Наверняка ваша конвертилка так умеет

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

Честно, такое уже продумывал, но как-то думаю проще возможно можно поступить

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

очень интересный подход, конечно напрягает

mkdir -p $f; rmdir $f;

создание и удаление, но видимо никак больше; спасибо

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

А такой вопрос, а если в программе можно задавать только конечный каталог, например, как вот здесь:

icns2png -x -s 128 $f -o Where_to_place_extracted/files


то как поступить лучше?

NK ★★★★★
() автор топика

Я использую самописный скриптик - http://al.libra.nsu.ru/make_small_copy.py

Usage: /home/al/bin/make_small_copy.py --destination=DIR --base=DIR [options ...] source_directory ...

Where options include:

--quality value      JPEG compression level from 1 to 100, default is 70
--size geometry      output images size, <WIDTH>x<HEIGHT>, default is 1024x600
--rewrite            force to rewrite destination file if source is unchanged
--dry-run            perform a trial run with no changes made
--verbosity level    set verbosity level, default is 1:
                     0 - errors only, 1 - progress information, 2 - detail information, 3 - debug

например: nice -n 5 make_small_copy.py --base=. --destination=previews/ 2010-* 2009-*

Осторожней! По умолчанию перезаписывает изменённые файлы. Может содержать ошибки.

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

спасибо конечно, с питоном не особо, средствами shell хочется решить

NK ★★★★★
() автор топика

А вот кажется нашел решение

basename

Выводит ИМЯ без предшествующих названий каталогов.


Т.е. ${f/`basename $f`/}

NK ★★★★★
() автор топика

странно, что-то не выходит в самом начале

find . -type f -name «*.jpg» -exec sh -c 'f={}; echo ${f}' \;


Именно с файлами в которых есть пробелы в имени O_o , как выяснил

Вот тут действительно загвоздка, как с пробелами быть?

NK ★★★★★
() автор топика

да уж, действительно в самом начале

find . -type f -name «*.jpg» -exec sh -c 'f={}' \;

sh: ЧАСТЬ_ИМЕНИ-файла: команда не найдена

NK ★★★★★
() автор топика

Ааа, разобрался, что ж такое(

mkdir -p «d i r»


так же и здесь

find . -type f -name «*.png» -exec sh -c 'f=«{}»; echo ${f}' \;

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

То же сначала не понял зачем, потом доперло, что это каталог с именем, как у файла еще создается и удаляем его

NK ★★★★★
() автор топика

Каждую неделю возникает такой тред. Запомните уже: самый простой способ рекурсивно обработать каталог — использовать find | while read f

И поиском по форуму пользуйтесь, он для того и существует.

find dir -type f -name '*.png' | while read f ; do
	f2="`echo "$f" | sed 's|^dir/|new_dir/|' `"
	mkdir -p "`dirname "$f2"`" && echo "$f" "`echo "$f2" | sed 's|.png$|.jpg|' `"
done

Вместо '&& echo' подставить '&& нужнаякоманда'.

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

> То же сначала не понял зачем, потом доперло, что это каталог с именем, как у файла еще создается и удаляем его

Во-первых, не с тем путём создаётся, надо /new_dir/$f, а не $f. Во-вторых за такой быдлокод надо руки отрывать — команда dirname для кого придумана?

geekless ★★
()
Ответ на: комментарий от NK
find dir -type f -name '*.png' -exec sh -c 'f="{}"; n=new_dir; mkdir -p "$n/$f"; rmdir "$n/$f"; convert "$f" "$n/$f.jpg"' \;

Проверенно, работает на именах с пробелами.

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

Не стыдно пятизвёздочному такую чушь нести?

С кавычками всё нормально, одни относятся к параметру вызова dirname, другие — к его результату.

Без внутренних кавычек будет так:

$ cat "`dirname a b/c`"
dirname: лишний операнд «b/c»
Попробуйте «dirname --help» для получения более подробного описания.
cat: : Нет такого файла или каталога
А без внешних так:
$ cat `dirname "a b/c"`
cat: a: Нет такого файла или каталога
cat: b: Нет такого файла или каталога
А правильный результат такой:
$ cat "`dirname "a b/c"`"
cat: a b: Нет такого файла или каталога

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

Проверенно

Проверено: создаёт лишний уровень вложенности (new_dir/dir/ вместо new_dir) и не убирает .png из имени файла.

vadim@host3:~$ mkdir -p dir/a/b/c/
vadim@host3:~$ touch dir/a/b/c/1.png
vadim@host3:~$ find dir -type f -name '*.png' -exec sh -c 'f="{}"; n=new_dir; mkdir -p "$n/$f"; rmdir "$n/$f"; cp "$f" "$n/$f.jpg"' \;
vadim@host3:~$ find new_dir/
new_dir/
new_dir/dir
new_dir/dir/a
new_dir/dir/a/b
new_dir/dir/a/b/c
new_dir/dir/a/b/c/1.png.jpg
geekless ★★
()
Ответ на: комментарий от geekless

geekless> пятизвёздочному

Какое тебе дело до кол-ва звезд? У тебе комплекс неполноценности?

С кавычками всё нормально,

Да, не подумал что `...` выполнится прямо в процессе парсинга строки.

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

> Какое тебе дело до кол-ва звезд?

Мне нет дела до количества звёзд. Мне странно наблюдать человека, который сидит тут с 2002 года, а не знает про dirname и путается в последовательности выполнения подстановок в sh.

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

> Работа выполнена

Работа не выполнена:

надо из ./dir/pic1/Aa/picture.png получить ./new_dir/pic1/Aa/picture.jpg

geekless ★★
()
Ответ на: комментарий от geekless
find dir -type f -name '*.png' -exec sh -c 'f="{}"; n=new_; mkdir -p "$n$f"; rmdir "$n$f"; convert "$f" "$n$f.jpg"' \;

Уровень вложенности убирается легко. А .png никому не мешает. Или мешает? Виндузятникам наверное, привыкли к расширениям.

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

> Уровень вложенности убирается легко.

«Ваш навык костылестроения увеличен на 10 пунктов.»

А .png никому не мешает.

У тебя в хомяке такой же бардак с названиями файлов?

Виндузятникам наверное, привыкли к расширениям.

Эк тебя корёжит-то. Виндузятники мерещатся?

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

Да, спасибо, кажется более-менее разобрался...

По теме, кажется придется shell-скрипт писать, одной командой/одним вводом, как оказалось сходу не так просто

NK ★★★★★
() автор топика

Извиняюсь, но наверно уже последний вопрос по этой теме)

Как попроще найти файлы отличные в имени от *png* ?
Т.е. например надо jpg обрабатывать, а вот png,txz и именно прочие файлы надо просто перенести с сохранением путей

Идея есть просто найти jpg - их удалить, потом опять сделать поиск по файлам и только тогда перенести, но это как-то даже не знаю

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