the industrial

都内で働くITエンジニアの日記

MacOSで、ディレクトリ内部の.heicファイルを一括で.jpgファイルに変換する方法

heicをjpegに変換するなんて、時代に逆行するエントリーで...本当に申し訳ないと思っている...!

f:id:omiend:20171124130404j:plain

結論

$ find . -name '*.heic' | xargs -IT basename T .heic | xargs -IT sips --setProperty format jpeg ./T.heic --out ./T.jpg;
/Users/endo/Downloads/IMG_8738.heic
  /Users/endo/Downloads/IMG_8738.jpg
  • findで .heic ファイルを一覧
  • xargs で受けとり、basenameを利用して *.heic の拡張子を一度除外
  • さらに xargs で受けとり、sipsコマンドで変換

概要

iPhoneのOSをiOS11にしてかららしいのだけど、iPhoneで撮影した画像が全て .heic 形式になった。

それ自体は別に良いのだけど、 .heic 対応していないアプリなんかで弾かれてしまう。

Shell芸でなんとかできるかなと調べた結果、上記のコマンドででけた。

ただ・・・

xargs -IT basename T .heic

を挟むのが納得行かない。

何故やっているのかというと、もともとはこんなふうに書けばいいかなと思ったのに、xargs内では変数展開(下記の ${T%.*}.jpg )が出来ない?っぽく、ファイル名が空になってしまったから。

$ find . -name '*.heic' | xargs -IT sips --setProperty format jpeg T --out ${T%.*}.jpg;
/Users/endo/Downloads/IMG_8738.heic
  /Users/endo/Downloads/.jpg

例えば、これだったら変数展開で出来る。

$ for target in ./*.heic; do
>   sips --setProperty format jpeg $target --out ./${target%.*}.jpg;
> done
/Users/endo/Downloads/IMG_8738.heic
  /Users/endo/Downloads/IMG_8738.jpg

でも、ワンライナーで書きたいやん?