Subject: How do I remove a file with funny characters in the filename ? Date: Thu Mar 18 17:16:55 EST 1993
古典的な答としては、
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" をかけます。
これはファイルの情報を壊します。もし残しておきたければ、次のことをやっ てください。
そしてファイルを見つけるために、