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

TJ *_*oll 3 linux bash less

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

之前:

/css
/less
    a.less
    b.less
/whatever
    /css
    /less
        c.less
        d.less
Run Code Online (Sandbox Code Playgroud)

后:

/css
    a.css
    b.css
/less
    a.less
    b.less
/whatever
    /css
        c.css
        d.css
    /less
        c.less
        d.less
Run Code Online (Sandbox Code Playgroud)

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

find . -name *.less
Run Code Online (Sandbox Code Playgroud)

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

lessc foo.less > ../css/foo.css
Run Code Online (Sandbox Code Playgroud)

我的问题是试图将结果输入findlessc.根据这个问题,我可以看到如何find通过管道传递结果cat,但同样的方法对我不起作用lessc.

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

谢谢.

编辑

这对我有用.谢谢@ghoti!

find . -name \*.less -print | sed -rne 's:(.*)/less/([^/]+).less$:lessc & > \1/css/\2.css:p' | sh
Run Code Online (Sandbox Code Playgroud)

gho*_*oti 6

你有所有的成分.你只需要食谱.:-)

并且有多种食谱.

通常,您可以使用find's -exec选项根据找到的内容执行操作.但是,你所能命名的东西是有限的.例如,如果您要使用此:

find . -name \*.less -exec lessc {} ../css/{}.css
Run Code Online (Sandbox Code Playgroud)

你将在运行find的父目录的css目录中创建文件,文件将被命名为a.less.css,b.less.css等等.这不好.你需要在dirname你的命令中嵌入这样的东西,然后用太多的引号和反斜杠来管理事情.

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

find . -name \*.less -print | \
  sed -rne 's:(.*)/less/([^/]+).less$:lessc & > \1/css/\2.css:p'
Run Code Online (Sandbox Code Playgroud)

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]$ 
Run Code Online (Sandbox Code Playgroud)

然后测试运行:

[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]$ 
Run Code Online (Sandbox Code Playgroud)

然后最后一次运行,结果.

[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]$ 
Run Code Online (Sandbox Code Playgroud)

对于我的测试,我更换lessccat,因为我的工作站上没有安装较少的.

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