3

我正在寻找一个 bash 脚本,它将递归地查找.less目录中的所有文件,.csscss使用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

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

一般来说,我只是无法将这些碎片拼凑在一起。任何帮助,将不胜感激。

谢谢。

编辑

这对我有用。谢谢@ghoti!

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

3 回答 3

6

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

并且有多种食谱。

通常,您可以使用find'-exec选项根据找到的内容执行操作。但是,您可以命名事物的方式受到限制。例如,如果你要使用这个:

find . -name \*.less -exec lessc {} ../css/{}.css

您将在运行 find 的父级的 css 目录中创建文件,并且文件将被命名为 a.less.css、b.less.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]$ 

对于我的测试,我替换lessccat,因为我的工作站上没有安装 less。

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

于 2012-06-06T17:35:53.383 回答
1

使用 for 循环

for file in $(find . -name *.less)
do
    css="${file//less/css}"
    mkdir -p $(dirname "$css")
    lessc "$file" > "$css"
done
于 2012-06-06T17:27:10.113 回答
0

如果您的 .css 文件在D:\demo文件夹中,请创建一个包含以下内容的文件convert.bat

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

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

于 2020-02-03T08:04:25.063 回答