Крошечный и простой сбой сценария и это являются выводом “Никакой такой файл или каталог”

potrace

Я нашел этот пример на ТАК в Вопросы и ответы названный: Как преобразовать изображение JPEG в использование формата SVG ImageMagick?. Один из ответов предлагается potrace.

$ convert input.jpg output.ppm
$ potrace -s output.ppm -o svgout.svg

Результаты

           ss #1            ss #2

Взгляд на potrace веб-сайт можно, по-видимому, пойти непосредственно от BMP до SVG.

$ potrace -s input.bmp -o output.svg

автотрассировка

Другая опция к potrace autotrace.

$ autotrace -output-file ouput.svg -output-format svg --color-count 4 input.bmp

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

Результаты

                                                 ss #3

Чтобы использовать?

Из этих 2 это действительно зависит от исходного материала. Если Вы преобразовываете изображения затем potrace вероятно более оптимальный вариант. Для нефото материала, такого как шрифты и неодушевленные объекты, такие как пейзаж, который включает вещи как дороги, затем autotrace с --centerline переключатель.

В то время как не оптимальный для фотографий, это делает хорошее задание на штриховой графике и подобных плакату изображениях. Не также успевает с цветом. Автотрассировка имеет некоторые функции, не доступные во встроенном диалоговом окне Potrace в Inkscape. Например, существует переключатель средней линии, который особенно полезен для трассировки дорог (в картах) или символы шрифта.

Пакетные преобразования

Можно перенести любую из этих команд в для цикла в Bash, который сделает легкую работу из выполнения объемных задач преобразования.

$ for i in *.bmp; do  ... "$i"; done

Ссылки

2
03.10.2014, 15:39
2 ответа

Извлеките часть IFS.

$IFS является внутренней переменной разделителя полей bash. Строка в скрипте приводит к тому, что bash разделяет поля только в новых строках, а не по умолчанию (пробел, табуляция и новая строка). Вывод ls разделен на табуляции.

This works:

#!/bin/bash

command="ls /tmp"

for file in `$command`;
do
    echo $file
done
0
27.01.2020, 22:00

Проблема в том, что bash не будет правильно выполнять переменные, содержащие пробелы, потому что вы установили $ IFS на новую строку. Это заставляет его пытаться выполнить все как одну команду вместо того, чтобы принимать первое слово как команду и передавать остальные как аргументы.

Если бы вы запустили это с помощью strace , вместо того, чтобы увидеть это:

execve("/bin/ls", ["ls", "/tmp"], [/* 42 vars */]) = 0
                   ---    -----
                    |       |-------------> 2nd argument 
                    |---------------------> 1st argument, the command to run.

, вы бы увидели, что первый аргумент - ls / tmp вместо ls в одиночку, и это то, что система не может выполнить.

Ваш сценарий действительно будет работать так, как вы ожидаете, если вы не установите переменную IFS . Однако вам действительно никогда не следует использовать ls для перебора вывода команды, если вы не знаете , что вывод никогда не будет содержать пробелов или других странных символов. Для иллюстрации:

$ touch 'file name with spaces'
$ for i in $(ls ./); do echo "$i"; done
file
name
with
spaces

Правильный способ - использовать один из следующих:

$ for i in *; do echo "i is: $i"; done
i is: file name with spaces
$ find . -type f | while IFS= read -r i; do echo "i is: $i"; done
i is: ./file name with spaces

Если вы действительно, действительно хотите использовать ls , по крайней мере, используйте его с циклом while. Это по-прежнему будет нарушать различные функции, но, по крайней мере, может иметь дело с пробелами:

$ ls | while read i; do echo "i is: $i"; done
i is: file name with spaces

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

  $ find . -type f -print0 | while IFS= read -r -d '' i; do echo "i is: $i"; done
  i is: ./file name with spaces
4
27.01.2020, 22:00

Теги

Похожие вопросы