Quantcast
Channel: Bashタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 2878

すべてのファイルをBase64エンコードして、別々のファイルにリダイレクトする

$
0
0

テストのために多量の画像ファイルをBase64エンコードしなくちゃいけなくなったので、そのためのワンライナーを記録しておきます。

コード

カレントディレクトリ直下のimgディレクトリ内にあるpngファイルをすべてbase64エンコードして、元ファイル名の末尾に.txtを付けたテキストファイルに書き出します。

find ./img -name'*.png'-type f -print0 | xargs -0-i{} sh -c'base64 {} > {}.txt'

ファイル名に{}が含まれる場合は上手くいかないと思います。

解説

findxargsの組み合わせは非常に強力で、多くのファイル操作を自動化してくれます。

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$1a$2b.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]を実行します。

以上です。
誤り等ございましたらご指摘下さい。


Viewing all articles
Browse latest Browse all 2878

Trending Articles