同じ親ディレクトリ内の同じ名前のファイルとディレクトリ - Solaris 8、ufs
-
01-07-2019 - |
質問
そうですね、私は Solaris を 10 年以上使ってきましたが、こんなことは一度も見たことがありません...
同じ名前のファイルとサブディレクトリの両方を含むディレクトリのリストがあります。
-rw-r--r-- 1 root other 15922214 Nov 29 2006 msheehan
drwxrwxrwx 12 msheehan sysadmin 2048 Mar 25 15:39 msheehan
file を使用してファイルの内容を検出すると、次の結果が得られます。
bash-2.03# file msheehan
msheehan: directory
bash-2.03# file msh*
msheehan: ascii text
msheehan: directory
ファイルについては心配ありませんが、ディレクトリは保持しておきたいので、rm を試してみます。
bash-2.03# rm msheehan
rm: msheehan is a directory
それで、これが私の2つの部分からなる質問です:
- これはどうしたのですか?
- ファイルを慎重に削除するにはどうすればよいですか?
ジョナサン
編集:回答ありがとうございます。(これまでのところ)どちらも役に立ちましたが、リストをエディターにパイプすることでうまくいきました。
bash-2.03# ls -l > jb.txt
bash-2.03# vi jb.txt
含まれているもの:
-rw-r--r-- 1 root other 15922214 Nov 29 2006 msheehab^?n
drwxrwxrwx 12 msheehan sysadmin 2048 Mar 25 15:39 msheehan
バックスペースキーには常に注意してください。
解決
シェルが名前の拡張バージョンを渡したときにコマンド ファイルがそれらを区別できたため、これらは実際には同じ「見た目」の 2 つの異なるファイル名であると推測します。ls を od または別の 16 進/8 進ダンプ ユーティリティにパイプして、それらが本当に同じ名前であるかどうか、または印刷されない文字が含まれているかどうかを確認してください。
他のヒント
何が原因なのか気になります。ファイルシステムのバグとは別に、非 ASCII 文字が何らかの形で侵入したことが原因である可能性があります。その場合は、より簡単な文字列セマンティクスを持つ別の言語を使用して操作を実行してください。
この Ruby スニペットの出力がどうなるかを見るのは興味深いでしょう:
ruby -e 'puts Dir["msheehan*"].inspect'
iNodeを使用して削除できます
「ls」に「-i」オプションを使用した場合
$ ls -li
total 1
20801 -rw-r--r-- 1 root root 0 2010-11-08 01:55 a?
20802 -rw-r--r-- 1 root root 0 2010-11-08 01:55 a\?
$ find . -inum 20802 -exec rm {} \;
$ ls -li
total 1
20801 -rw-r--r-- 1 root root 0 2010-11-08 01:55 a?
Solaris で iNode を使用してファイルを削除する方法の例 (スペイン語) を示します。http://sparcki.blogspot.com/2010/03/como-eliminar-archivos-utilizando-su.html
ウルコさん
そして、私自身の質問のパート 2 に対する簡単な答え...
ディレクトリの名前を変更し、ファイルを削除し、ディレクトリの名前を再び元の名前に戻すことができると思います。
...私は他の人が何を思いつくかを見ることにまだ興味があります。
JB
そのうちの1つは名前に奇妙な文字が入っているのではないかと思います。シェルのワイルドカード拡張を使用して次のことを確認してみてください。タイプ
cat msh*
そして、ワイルドカード拡張キーを押します (私のシェルでは Ctrl-X * です)。2 つの名前がリストされ、そのうちの 1 つにエスケープ文字が含まれている可能性があります。
ファイルに特殊文字があるかどうかを確認するには、LSに-bまたは-qオプションを試してください。Solaris8にはこれらのオプションがあると仮定します。
ファイルを削除する別のソリューションとして、グラフィカルファイルブラウザー(GASP!)を表示し、不要なファイルをゴミ箱にドラッグアンドドロップできます。
別の解決策は、1 つのファイルを別の名前 (不明な特殊文字を含まない名前) に移動し、ワイルドカードを使用して特殊文字のディレクトリ名を削除することです。
mv msheehan temp
rm mshee*
mv temp msheehan
もちろん、削除したいファイルのみがワイルドカードに一致することを確認する必要があります。そして、あなたの特定のケースでは、一方はディレクトリであり、もう一方はファイルであるため、このコマンドですべてが解決される可能性があります。
rmdir msheeha*
印刷されない文字や空白を確認する簡単な方法の 1 つは、出力をパイプすることです。 猫 - 獣医, 例:
# ls -l | cat -vet
素敵で覚えやすいです!
パート 2 では、1 つの名前に 2 つの余分な文字が含まれるため、次を使用できます。
mv sheehan abc
mv sheeha??n xyz
それが完了すると、再び正しいファイル名が得られ、必要に応じて修正できます。