こんな感じで、aws cliからコマンドをうつと、こんな感じになります(コマンド、出力はダミーです)。
$ aws s3 ls --recursive bucket/photo/1/
2014-05-06 16:45:30 11979 photo/1/20140506164529_スクリーンショット 2014-01-28 15.27.48.png
ところが、これにたとえば以下のようなコマンドに変えると、とたんに面倒くさいことになります。
$ aws s3 ls --recursive bucket/photo/1/ | tee /dev/null
2014-05-06 16:45:30 11979 photo/1/20140506164529_????????? 2014-01-28 15.27.48.pn
化けた!
なお、リダイレクトでファイル出力したときにも同じ現象が発生します。
対策
原因はaws
コマンドを実装しているPython処理系にあります。Pythonは出力先に応じて文字コードを合わせてくれるのですが、リダイレクトやパイプの場合には、出力先の文字コードがわからないので、強制的にASCIIではき出してくれるのです!!! 余計なまねを!!!
対策としては、PYTHONIOENCODING
という環境変数・シェル変数を定義しておけばいいです。
$ PYTHONIOENCODING=UTF-8 aws s3 ls --recursive bucket/photo/1/ | tee /dev/null
2014-05-06 16:45:30 11979 photo/1/20140506164529_スクリーンショット 2014-01-28 15.27.48.png