我正在寻找一个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)
我的问题是试图将结果输入find到lessc.根据这个问题,我可以看到如何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)
你有所有的成分.你只需要食谱.:-)
并且有多种食谱.
通常,您可以使用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)
对于我的测试,我更换lessc了cat,因为我的工作站上没有安装较少的.
请注意,这只适用于简单的文件名,例如示例中的文件名.如果您有空格或可能有其他"特殊"字符,它将会中断.
| 归档时间: |
|
| 查看次数: |
1658 次 |
| 最近记录: |