Linux」カテゴリーアーカイブ

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

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で作成時間絞りこんで消せ

pacman -Syu したらエラーが出たので適当に対処

tomoari:~% sudo pacman -Syu
:: Synchronizing package databases...
:: Starting full system upgrade...
resolving dependencies...
looking for inter-conflicts...

Targets (40): (略)

Total Download Size:    30.87 MiB
Total Installed Size:   433.45 MiB
Net Upgrade Size:       0.80 MiB

Proceed with installation? [Y/n] y
(40/40) checking package integrity                       [##############################] 100%
(40/40) loading package files                            [##############################] 100%
(40/40) checking for file conflicts                      [##############################] 100%
error: failed to commit transaction (conflicting files)
glibc: /lib exists in filesystem
Errors occurred, no packages were upgraded.

まあ、アップデートかけたらglibcが文句言ってきたので、適当に沈めました。
/lib を消すのはさすがに怖すぎるので、とりあえずエラー吐いてるっぽいglibcだけ後回し。

tomoari:~% sudo pacman -Syu --ignore glibc

これでうまく行ったら、最後にもう一回 –ignore なしでやってみると良い