テストのために多量の画像ファイルをBase64エンコードしなくちゃいけなくなったので、そのためのワンライナーを記録しておきます。
コード
カレントディレクトリ直下のimg
ディレクトリ内にあるpngファイルをすべてbase64エンコードして、元ファイル名の末尾に.txtを付けたテキストファイルに書き出します。
find ./img -name'*.png'-type f -print0 | xargs -0-i{} sh -c'base64 {} > {}.txt'
ファイル名に{}
が含まれる場合は上手くいかないと思います。
解説
find
とxargs
の組み合わせは非常に強力で、多くのファイル操作を自動化してくれます。
find [dir] -name [pattern] -type f -print0
ディレクトリ[dir]
内の[pattern]
にマッチするファイルのファイル名の一覧を出力します。
-print0
オプションは、出力結果の区切り文字を空白文字からNull文字に置換します。これは、ファイル名に空白文字を含むファイルがあったときにも、適切に動作させるためのものです。
xargs -0 -i[replace-str] [command]
[command]
の引数に、標準入力を渡します。
-0
オプションをつけると、Null文字を引数の区切り文字とします(このオプションがないと、空白文字が区切り文字になります)。find
の-print0
オプションと合わせて、ファイル名に空白文字を含む場合も適切に動作するようになります。このオプションを省略し、たとえば、a b.png
が標準入力に渡された場合、[command] a b.png
($1
がa
、$2
がb.png
)が実行されることになってしまいます。
-i[replace text]
オプションは、[command]
内の[replace text]
を、標準入力の値に置換します。
なお、本来xargs
は、標準入力に複数の入力が与えられた場合、それらすべてを一度にコマンドの引数に渡しますが、このオプションが指定された場合は、標準入力を1つずつ渡します。
つまり、1.png 2.png
が標準入力に渡された場合、通常は[command] 1.png 2.png
が実行されるところを、[command] 1.png
と[command] 2.png
が実行されることになります。
ちなみに、xargs
には-n
オプションがあり、一度にコマンドに渡す引数の数を指定できます。
sh -c [expression]
[expression]
を実行します。
以上です。
誤り等ございましたらご指摘下さい。