0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

0
Last updated at Posted at 2020-03-17

テストのために多量の画像ファイルを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]を実行します。

補足

一応補足しておきますが、上記のコマンドはOSコマンドインジェクションの脆弱性がありますので、本番稼働しているシステムに組み込んだりすることは、お止め下さい。

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?