目的
- JavaScriptに複数のファイル名を渡したいです。
- bashでサクッと作りたい
環境
- MacOS/bash5.0
- centOS7/bash4.24
方法
- bashで複数ファイル(例えばpng)を
findで取得し整形する。 -
hoge.jsというテンプレートの変数宣言の場所に1.の結果を入れる - JavaScriptの配列定義は
foo = ["a.png", "b.png"]というフォーマットに合わせます。
コード
# 結果が何もない場合に備えて空文字を入れておく。
$ lst_png="" ; touch a.png b.png C.png;
# ファイル名で検索する。念のためソートしておく。改行を,に変えて文字列にする。
$ lst_png=$( find . -name "*.png" -printf "\"%f\"\n" | sort | sed -z 's|\n|,|g' ); echo ${lst_png}
"C.png","a.png","b.png",
# JavaScript用に最後の1文字を消して、テンプレートに置換する
$ sed -e "s|%1|${lst_png/%?/}|" hoge.js > tmp.js
- 説明です。
- bashの
findで-printfで出力フォーマットを整えています。"%f"はファイル名単体を取得します。その前後に"を加えるためにエスケープシーケンスを加えて\"としています。 -
=$()はコマンド実行して標準出力文字列を変数定義するいつもの方法ですね。 -
findはソート機能がないので必要に応じてsortでソートします。その他も改行単位でゴニョゴニョできます。ソートが必要ないならこの時点で文字列にしてもいいでしょう。-printf "\"%f\","となるのではないかと思います。 -
sedで/を使わず|を使っているのは、コード再利用で万が一変数にディレクトリの文字列/が混じったときに誤動作しないようにです。
# 最終文字を取る書き方
$ echo ${lst_png/%?/}
"C.png","a.png","b.png"
- テンプレート(hoge.js)にある
%1を3つ目のsedでlst_pngを置換しています。ここで一番最後にあるデリミタ文字,を消したいのでbashの機能を使います。それが/%?/です。知っていれば簡単ですね。最後から検索して1文字を示す?で削除しています。
確認です
$ cat hoge.js
...
const lst_png = [ %1 ];
...
$ cat tmp.js
...
const let_png = [ "C.png","a.png","b.png" ];
...
- どなたかのお役に立てれば嬉しいです(コメント歓迎)。