Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: не могу победить пайплайн в баше  (Прочитано 1045 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн beatlejuse

  • Автор темы
  • Новичок
  • *
  • Сообщений: 26
    • Просмотр профиля
Добрый лень!
Столкнулся с необходимостью преобразовать в баше все файлы типа less в файлы типа css в определенной папке.
Для этого используется утилита lessc в таком виде: lessc styles.less styles.css (где первый файл - источник, второй - назначение).
Для начала ищу все файлы: find . -name *lk.less (для отладки в текущей папке и по точному имени, чтобы отработать на одном файле).
А вот дальше начинаются проблемы.
хотел использовать ключ find -exec и передать туда lessc, но синтаксис не позволил правильно использовать имя файла. максимум, что можно сделать - это find . -name *lk.less -exec lessc {} {}.css \;
но тогда на выхлопе будет файл lk.less.css вместо lk.css
потом думал сделать двумя командами и первой положить хотя бы путь (потому что find  отдаёт полный путь к файлу и в самом find распарсить он его не дал) в переменную.
но не тут то было. и "find . -name *lk.less | pathfile=", и "pathfile = find . -name *lk.less" кладут на это дело болт.
далее пробовал всякие дикие варианты типа передачи пути и парсинга последовательно через пайплайн (find . -name *lk.less -exec echo {} \; | grep [a-z]* | echo) но видимо я не дло конца понимаю смысл пайплайна. потому что если после первого ещё выходит что то осмысленное, то после второго - только пустая строка.
Помогите достичь цели!

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
Re: не могу победить пайплайн в баше
« Ответ #1 : 17 Марта 2017, 17:05:29 »
Код: (bash) [Выделить]
find '/путь/до/нужной/папки' -type f -name '*.less' \
| while read l ; do file="${l##*/}"; dir="${l%/*}"; \
lessc "$l" "${dir}/${file%.*}.css" ; done

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: не могу победить пайплайн в баше
« Ответ #2 : 17 Марта 2017, 17:26:13 »
find . -name *lk.less -exec bash -c 'lessc $0 ${0%.less}.css' {} \;renzrv, перемудрили слегка ;)
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн beatlejuse

  • Автор темы
  • Новичок
  • *
  • Сообщений: 26
    • Просмотр профиля
Re: не могу победить пайплайн в баше
« Ответ #3 : 17 Марта 2017, 17:41:53 »
спасибо!

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
Re: не могу победить пайплайн в баше
« Ответ #4 : 17 Марта 2017, 17:42:13 »
Цитировать
-exec bash -c
На каждый файл - новый процесс bash?

Цитировать
$0 ${0%.less}.css' {} \;
А если пробелы?

(Нажмите, чтобы показать/скрыть)

find -type f -name '*.less' | while read l ; do f="${l##*/}"; d="${l%/*}"; lessc "$l" "${d}/${f%.*}.css" ; done

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: не могу победить пайплайн в баше
« Ответ #5 : 17 Марта 2017, 17:54:42 »
На каждый файл - новый процесс bash?
Так и так новый процесс с lessc
А если пробелы?
Это да. Хотя сам {} можно не брать в кавычки, его и так подхватывает.
d="${l%/*}"
Зачем отделять путь, а потом его прицеплять? ${f%.less} вполне достаточно чтобы убрать расширение у файла и путь не трогает.
| while read
Не привыкайте к плохому: while read … ; do … done < <(…)
« Последнее редактирование: 17 Марта 2017, 17:59:29 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
Re: не могу победить пайплайн в баше
« Ответ #6 : 17 Марта 2017, 22:05:17 »
Так и так новый процесс с lessc
В вашем варианте на каждом файле запускаетя по 2 процесса, в моем - один.

Зачем отделять путь, а потом его прицеплять? ${f%.less} вполне достаточно чтобы убрать расширение у файла и путь не трогает.
Да верно, путь можно было не отделять. Оставил его для наглядности, и чтобы автору и другим было видно как применять эту конструкцию для других команд где нужен отдельный путь к директории файла и/или его изменение.

Не привыкайте к плохому:
А чем это:
while read … ; do … done < <(…)лучше
| while read?

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: не могу победить пайплайн в баше
« Ответ #7 : 17 Марта 2017, 22:09:25 »
|(пайп) подразумевает новый субпроцесс(столь нелюбимый Вами) и если в нем назначаются/изменяются какие-нибудь переменные, то они будут недоступны в основном процессе.
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
Re: не могу победить пайплайн в баше
« Ответ #8 : 17 Марта 2017, 22:42:22 »
Ну так этот же субпроцесс стартует только один раз запуске конвеера,
а про сохранение/несохранение значений переменных после цикла знаю, и если это вся разница, то варант c | while read считаю лучше т.к.:
1. Короче на 3 символа.
2. Логичный порядок:
(вывод строк) | (разбор и выполнение)а не через "задний проход" цикла со скобками и стрелочками.

 

Страница сгенерирована за 0.052 секунд. Запросов: 23.