使用lessc从.less文件生成.css的Bash脚本

时间:2012-06-06 17:17:14

标签: linux bash less

我正在寻找一个bash脚本,它将以递归方式查找目录中的所有.less文件,并使用{在父.css目录中创建一个具有相同名称的css文件{1}}。在视觉上它看起来像这样。

在:

lessc

后:

/css
/less
    a.less
    b.less
/whatever
    /css
    /less
        c.less
        d.less

到目前为止,我能够弄清楚的是我可以使用以下方法找到所有文件:

/css
    a.css
    b.css
/less
    a.less
    b.less
/whatever
    /css
        c.css
        d.css
    /less
        c.less
        d.less

我可以使用以下方式生成单个文件:

find . -name *.less

我的问题是尝试将lessc foo.less > ../css/foo.css 的结果导入find。每this question我可以看到lessc的结果如何传递到find,但同样的方法对我cat无效。

总的来说,我只是把这些碎片放在一起很麻烦。任何帮助,将不胜感激。

感谢。

修改

这对我有用。谢谢@ghoti!

lessc

3 个答案:

答案 0 :(得分:6)

你已经拥有了所有的成分。你只需要食谱。 : - )

并且有多种食谱。

通常,您可以使用find的{​​{1}}选项根据找到的内容执行操作。但是,你所能命名的东西是有限的。例如,如果你要使用它:

-exec

你将在运行find的父目录的css目录中创建文件,文件将被命名为a.less.css,b.less.css等等。这不好。你需要将find . -name \*.less -exec lessc {} ../css/{}.css 等嵌入到你的命令中,然后用太多的引号和反斜杠来管理事情。

当我必须进行模式匹配和这样的更改时,我经常使用管道。这就是我要做的事情:

dirname

find . -name \*.less -print | \ sed -rne 's:(.*)/less/([^/]+).less$:lessc & > \1/css/\2.css:p' 获取您的文件,正如您所期望的那样。然后find脚本将它们变成命令行。这个输出是sed命令行的集合,一旦您确认它们看起来正确,您就可以直接输入lessc

以下是结果。

在:

sh

然后测试运行:

[ghoti@pc ~/tmp1]$ find . -type f -print
./whatever/less/c.less
./whatever/less/d.less
./less/a.less
./less/b.less
[ghoti@pc ~/tmp1]$ 

然后是最后一次运行,结果。

[ghoti@pc ~/tmp1]$ find . -name \*.less -print | sed -rne 's:(.*)/less/([^/]+).less$:cat & > \1/css/\2.css:p'
cat ./whatever/less/c.less > ./whatever/css/c.css
cat ./whatever/less/d.less > ./whatever/css/d.css
cat ./less/a.less > ./css/a.css
cat ./less/b.less > ./css/b.css
[ghoti@pc ~/tmp1]$ 

对于我的测试,我将[ghoti@pc ~/tmp1]$ find . -name \*.less -print | sed -rne 's:(.*)/less/([^/]+).less$:cat & > \1/css/\2.css:p' | sh [ghoti@pc ~/tmp1]$ find . -type f -print ./css/b.css ./css/a.css ./whatever/less/c.less ./whatever/less/d.less ./whatever/css/d.css ./whatever/css/c.css ./less/a.less ./less/b.less [ghoti@pc ~/tmp1]$ 替换为lessc,因为我的工作站上没有安装较少的。{/ p>

请注意,这只适用于您的示例中的简单文件名。如果您有空格或可能有其他“特殊”字符,它将会中断。

答案 1 :(得分:1)

使用for循环

for file in $(find . -name *.less)
do
    css="${file//less/css}"
    mkdir -p $(dirname "$css")
    lessc "$file" > "$css"
done

答案 2 :(得分:0)

如果您的.css文件位于D:\demo文件夹中,请创建一个文件convert.bat,其中包含:

$ d:
$ cd demo
$ lessc style.less style.css

运行此文件时,它将.less转换为.css。