Linux で文字コードが違うファイル名を rm / mv する方法

2013/4/29
Original: http://blog.osyoyu.com/2013/04/how-to-rm-a-broken-character-code-file/

unzip を使ってzipファイルを展開するとき、中身のファイル名に日本語が含まれてると十中八九残念な結果になります。

tomoari@mirin:~/zip% ls -q
total 63M
-rw-r--r-- 1 tomoari users 146K Dec  9  2007 119?l?C???X?g.jpg
-rw-r--r-- 1 tomoari users 8.0M Nov  6  2008 ?????g 2M MIX.mp3
-rw-r--r-- 1 tomoari users 8.0M Nov  6  2008 ?????g 3M MIX ?J???I?P.mp3
-rw-r--r-- 1 tomoari users 8.0M Nov  6  2008 ?????g 3M MIX.mp3
-rw-r--r-- 1 tomoari users 7.9M May 16  2008 ?????g .mp3
-rw-r--r-- 1 tomoari users 218K May 21  2008 MELT2M.jpg
-rw-r--r-- 1 tomoari users 3.4K Nov  6  2008 ???Ƃ???.txt

目も当てられない感じですね。ところでこれ厄介なのが、ファイル名をキーボードから入力できないので rm できないんです。一番上の 119?l?C???X?g.jpg は 119 まで入力して補完してもらえばいいとして、 ?????なんちゃらのファイルはもちろん ? を入力しても補完されるわけでもなく、悲しいことになります。

というわけですが、まあこんなものは ls -Q してやればぶっこわれたファイル名も文字コードで表示してくれます。
ls --help には "enclose entry names in double quotes" って書いてありますね。

tomoari@mirin:~/zip% ls -Q
total 63M
-rw-r--r-- 1 tomoari users 146K Dec  9  2007 "119\227l\203C\203\211\203X\203g.jpg"
-rw-r--r-- 1 tomoari users  31M Apr 28 18:35 "3melt.zip"
-rw-r--r-- 1 tomoari users 8.0M Nov  6  2008 "\203\201\203\213\203g 2M MIX.mp3"
-rw-r--r-- 1 tomoari users 8.0M Nov  6  2008 "\203\201\203\213\203g 3M MIX \203J\203\211\203I\203P.mp3"
-rw-r--r-- 1 tomoari users 8.0M Nov  6  2008 "\203\201\203\213\203g 3M MIX.mp3"
-rw-r--r-- 1 tomoari users 7.9M May 16  2008 "\203\201\203\213\203g .mp3"
-rw-r--r-- 1 tomoari users 218K May 21  2008 "MELT2M.jpg"
-rw-r--r-- 1 tomoari users 3.4K Nov  6  2008 "\202\240\202Ƃ\252\202\253.txt"

やったね!これでrmできるね!
rm はこんな感じになります。エスケープされた文字を入力するときは $'' で囲まなければいけない。

tomoari@mirin:~/zip% rm 119$'\227'l$'\203'C$'\203'$'\211'$'\203'X$'\203'g.jpg

注: エスケープシーケンスから始まるファイル名はzshは補完してくれませんfindで作成時間絞りこんで消せ