C++ ときどき ごはん、わりとてぃーぶれいく☆

Wonder Rabbit Projectのなかのひとのブログ。主にC++。

端末で扱えないファイル名をどうにかする方法

とあるCMSで運用されていたウェブサイトが更新を終了したのでコレを静的HTMLに変換しようとしたところ次のようなファイル名(やディレクトリ名)のファイル郡が得られてしまった・w・;

先ずはウェブサイトを丸ごとごっそりとwgetにミラーリングオプション付けて回収。

test-machine /tmp/% wget -m http://www.hoge.fuga/

さて、何やらおかしなことに・・・。

test-machine /tmp/www.hoge.fuga/poyo% ls
合計 96K
-rw-r--r-- 1 test-user users  26K  2月 28 11:35 ?%81??%81%98?%82%85?%81?
-rw-r--r-- 1 test-user users  13K  2月 28 11:35 ?%81%88?%82%93?%81%92?%81%8D
-rw-r--r-- 1 test-user users  19K  2月 28 11:35 ?%81%8A?%82%93?%81%8C?%81%8F
-rw-r--r-- 1 test-user users  22K  2月 28 11:35 ?%81%96?%81??%81%8B
drwxr-xr-x 1 test-user users  198  2月 28 11:35 .
drwxr-xr-x 1 test-user users 1.1K  2月 28 12:06 ..

7bit+α文字文化圏で作られたCMSにありがちな、URLエンコードされていない生の文字列がURLとして使われてしまっていたでござるよ事件とかで発生する・x・;
こうなると正確なファイル名を簡単には扱えないので Konsole や Dolphine などで容易に mv とか F2でリネーム とか出来ない。

手っ取り早くどうにかするには、

test-machine /tmp/www.hoge.fuga/poyo% declare -i i=0
test-machine /tmp/www.hoge.fuga/poyo% for file in *
for% do
for% mv $file $i
for% i=i+1
for% done

とかすると、

test-machine /tmp/www.hoge.fuga/poyo% ls
合計 96K
drwxr-xr-x 1 test-user users    8  2月 28 11:35 .
drwxr-xr-x 1 test-user users 1.1K  2月 28 12:06 ..
-rw-r--r-- 1 test-user users  26K  2月 28 11:35 0
-rw-r--r-- 1 test-user users  13K  2月 28 11:35 1
-rw-r--r-- 1 test-user users  19K  2月 28 11:35 2
-rw-r--r-- 1 test-user users  22K  2月 28 11:35 3

シェルからよしなに謎のファイル名を単なる 0 1 2 3 ... とかって連番のファイル名にできる。あとは煮出すなり焼き干すなり・w・b

※なお、なかのひとは zsh を使っていますが bash でも sh でも同様にできます。