3

.lessディレクトリ内のすべてのファイルを再帰的に検索し、を使用.cssして親cssディレクトリに同じ名前のファイルを作成するbashスクリプトを作成しようとしています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ことlesscです。この質問ごとに、の結果を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]$ 

私のテストでは、ワークステーションにインストールされていないものが少ないため、に置き換えlesscました。cat

これは、例のような単純なファイル名でのみ機能することに注意してください。スペースまたはおそらく他の「特殊」文字がある場合、それは壊れます。

于 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 に答える