Subject: How do I remove a file with funny characters in the filename ?
Date: Thu Mar 18 17:16:55 EST 1993

2.2) コントロールコードなど、変な文字を含む名前のファイルはどうやったら消 せるのですか。

'変な文字' というのが '/' なら、この解答の最後のほうを見て下さい。変な 文字が ' ' やコントロールコードや 8ビットキャラクタなどそれ以外のもの なら、このまま読み進んで下さい。

古典的な答としては、

rm -i some*pattern*that*matches*only*the*file*you*want
というのがあります。これはパターンに一致するそれぞれのファイルに対し、 あなたが消したいかどうか確認を求めてきます。シェルによっては、ファイル 名の8ビット目が立っているならうまくいかないかもしれません(シェルが落と してしまうかもしれません)。

また、

rm -ri .
というのもあります。これはディレクトリの各ファイルに対し、消すかどうか 尋ねてきます。望むファイルに対しては "y" と答え、それ以外には "n" と答 えて下さい。残念ながら、これは多くの rm では動きません。さらに残念なこ とに、"." の全てのサブディレクトリにも働いてしまうでしょう。サブディレ クトリには反応できないように、一時的に "chmod a-x" を行なわなくてはい けないかもしれません。

コマンドラインから rm の "-r" フラグやワイルドカードを使う時は、いつも 深呼吸してやっていることを考え、打った文字を再点検しましょう。

それから

find . -type f ... -ok rm '{}' ¥;
というのも使えます。"..." でファイルを一意的に決めます。一つの可能性は としては、("ls -i ." を使って)問題としているファイルの i-node を求め、

find . -inum 12345 -ok rm '{}' ¥;
又は

find . -inum 12345 -ok mv '{}' new-file-name ¥;
を使うことです。"-ok" は安全のためのチェックです。そのオプションによっ て、コマンドを実行して良いかどうか確認を求めてくるようになるでしょう。 もしあなたが危険でも良いと思ったり、ファイル名に変な文字列が入っていて、 表示すると画面がグチャグチャになるのではないかと思っているなら、確認を 避けるために代わりに "-exec" を使うこともできます。

ファイル名の中に '/' が入っている時はどうすれば良いのでしょうか。

そのようなのは本当に特別な場合で、カーネルにバグのあるときのみ生成され ます (典型的なのは、NFS でリモートマシンのファイル名に入っている不正な 文字を落とすことができない場合です)。最初にまず、なぜこのことがそんな に奇妙なのかを正確に理解するよう努力してみましょう。

UNIX のディレクトリは、単にファイル名と i-node を対であることを思い出 しましょう。ディレクトリは本質的には、次のような情報を含んでいるだけで す。

filename   inode
file1      12345
file2.c    12349
file3      12347
理論的には、'/' と '¥0' の2文字だけはファイル名には現れません。なぜな ら、'/' はディレクトリやファイル名を区切るのに使われるし、'¥0' はファ イル名の終りを表します。

不幸にも NFS によっては、リモートマシンの要求に対するレスポンスとして、 スラッシュが埋め込まれたファイル名を作り上げるでしょう。例えば、Mac な どの UNIX でないマシンのユーザーがあなたの UNIX マシン上に、ファイル名 に日付の入ったリモート NFS ファイルを作ろうとする時に起こります。そう すると、あなたの UNIX のディレクトリにはこのようなものができます。

ファイル名  i-ノード
91/02/07    12357
上のような記述を使って 'find' や 'rm' をいろいろいじくっても、このファ イルは消せないでしょう。これらのユーティリィに限らず UNIX のプログラム は、'/' を普通の使い方に解釈するようになっているからです。

通常のプログラムは、結局 unlink("91/02/07") を実行しようとします。カー ネルに関する限りでは、それは "ディレクトリ 91 のサブディレクトリの 02 の中のファイル 07 を unlink する" ということを意味します。しかしそれは 存在しません。カレントディレクトリには、"91/02/07" という名前のファイ ルがあるのです。これは重大ではありませんが、巧妙な違いです。

この場合、何ができるでしょうか。最初にやってみることは、このような記述 をした Mac に戻ることです。そして Mac とローカル NFS デーモンに、その ファイルを何かスラッシュを含まない名前に変えさせることができるかどうか 考えてみましょう。

それがうまく行かないか不可能なら、システム管理者の助けが必要でしょう。 そして次のうちの一つを試さなければなりません。"ls -i" を使って、この邪 魔なファイルの i-node を見つけます。そしてファイルシステムを unmount し、"clri" を使って i-node をクリアします。その後祈りながら、ファイル システムに "fsck" をかけます。

これはファイルの情報を壊します。もし残しておきたければ、次のことをやっ てください。

  1. 悪いファイル名があるディレクトリと同じ親ディレクトリに、新しい ディレクトリを作る。
  2. 可能な限り全て (つまり悪い名前の以外全部) を新しいディレクトリに移動する。
  3. 悪い名前のファイルを含むディレクトリで、i-node を知るため "ls -id"を行なう。
  4. ファイルシステムを umount する。
  5. 悪い名前のファイルのあるディレクトリで "clri" を実行する。
  6. ファイルシステムに "fsck" を実行する。

    そしてファイルを見つけるために、

  7. ファイルシステムをマウントし直す。
  8. あなたが作ったディレクトリを、古いディレクトリの名前に変える。 (古いディレクトリは "fsck" によって無くなっているはずだからです)
  9. "lost+found" の中からディレクトリの中に、ちゃんとした名前で移す。
もし "fsdb" があるなら、それを使って直接ファイルシステムの中をはいずり 回るという大変な方法でディレクトリを修復することもできます。


UNIX FAQ LIST / Copyright(c)1994,Ted Timar / tmatimar@isgtec.com


Maintainer: あさだ たくや