Ansatzの備忘録

勉強したことあるいはふと思い立ったこと

シェルワンライナー160本ノック問題2

問題2 画像ファイルの一括変換

問題のファイルは

https://github.com/shellgei/shellgei160

からダウンロードできる。

 

この問題はたくさんある「*.png」ファイルを一括で「*.jpg」に変換せよという問題だった。まず準備として

sudo apt install imagemagick

を実行して、convertコマンドを使えるように準備する。そして以下のコマンドを実行する:

ls *.png | sed 's/\.png$//' |xargs -I@ convert @.png @.jpg

xargsのオプションで-P$(nproc)をつけておくと早くなる。

私は最初、grepをまた使うのかななどと考え、

grep -o -E '[^\.png$]'

なんてものを実行してしまったがこれでは全く駄目である。ファイル名を抜き出すために末尾を消そうと考えていたのだがこれを実行すると出力が一文字ごとに改行された状態で出てくるため使えない。grepの仕様で、-oをつけると正規表現にマッチする文字だけを一つ一つ改行して出力するためである。そもそもこの正規表現が自分の意図にそぐわないものであることにも気が付いていなかった(ブログを書く段階になってやっと気づいた)。[]はこの中に含まれる文字のいずれかにマッチするという意味で、先頭を[^]とするとこの中のいずれの文字にもマッチしないという意味になる。$は外に出さないと行末の指定にはならないので無意味な表記だった。つまりこの表現だと「.」でもpでもnでもgでも$でもない文字にマッチするという意味になってしまう。自分の定義把握能力の低さに嫌気がさしてくるな。仕方がない。