私は、システム fedora 12 内の 1 つのプレーン テキスト ファイルに関する問題について完全に困惑しています。バイオインフォマティクスでよく知られているソフトウェアである Maker を使用して、多数のプレーン テキスト ファイルを作成しましたが、そのうちの 1 つが「アクセスできない」ようです。
Clon1918K_PCC1.gff
特に、... コマンドを使用すると、名前の付いたファイルがリストされますls, ls -a, ls -li
が、などでアクセスしようとすると、cat, vim, cp, ls
常に同じエラーが表示されますClon1918K_PCC1.gff: No such file or directory
。
ただし、このファイルを含むすべてのファイルをコピーするとcp *.gff
、cp *
このファイルもコピーされます。
また、問題なく Nautilus で開こうとしましたが、2 つのケースのうち 1 つでは、コンテンツを同じ名前の別のファイルにコピーすると、問題は解消しました。興味深いことに、この場合、奇妙なファイルは書き換えられず、まったく同じ名前の 2 つのファイルが表示され、そのうちの 1 つはアクセス可能で、もう 1 つはアクセスできません。隠し文字を探しましたが、すべて問題ないようです。
この奇妙な事件について何か心当たりのある方はいらっしゃいますか? よろしくお願いします!
答え1
同じディレクトリに同じ名前のファイルを 2 つ置くことはできません。ファイル名は定義上、一意のキーです。
あなたが持っているのは、ほぼ間違いなく特殊文字です。特殊文字を確認したことは知っていますが、具体的にはどのように確認したのでしょうか。特殊文字がどこにあるかを見つけるには、 のように言うことができます。上位ビットが設定されているバイト (つまり、からls *gff | hexdump -C
までの 16 進数値) は、何かが間違っていることを示しています。それより小さいもの(10 進数で 32) も特殊文字です。もう 1 つのヒントは、 の右側のテキスト列にドットがあることです。80
FF
20
.
hexdump -C
UTF-8 には US ASCII 文字に似た文字が多数あります。US ASCII でも、1 と l はよく似ています。また、キリル文字の C (U+0421)、ギリシャ文字の月状シグマ (U+03F9、これも C とまったく同じ)、キリル文字/ギリシャ文字の小文字 'o' などがあります。これらは目に見える文字だけです。目に見えない Unicode 文字もかなりあります。
説明:なぜ上位ビットは何か問題が発生したことを示すのでしょうか? ファイル名「Clon1918K_PCC1.gff」は 100% 7 ビット US ASCII のようです。これを実行するとhexdump -C
次のようになります:
00000000 43 6c 6f 6e 31 39 31 38 4b 5f 50 43 43 31 2e 67 |Clon1918K_PCC1.g|
00000010 66 66 |ff|
これらのバイト値はすべて0x80
7 ビットの US ASCII コードポイントであるため、以下 (8 番目のビットがクリア) になります。Unicode コードポイント U+0000 から U+007F は、従来の 7 ビット US ASCII 文字を表します。コードポイント U+0080 以上は他の文字を表し、UTF-8 で 2 バイトから 6 バイトとしてエンコードされます (Linux では、man utf8
これがどのように行われるかについて多くの情報があります)。定義により、UTF-8 は US-ASCII コードポイントをそれ自体としてエンコードします (つまり、16 進 ASCII 文字である41
Unicode U+0041 は、1 バイトとしてエンコードされます41
)。コードポイント ≥ 128 は 2 バイトから 6 バイトとしてエンコードされます。それぞれ8番目のビットが設定されている非ASCII文字の存在は、この方法で簡単に検出できます。ストリームをデコードすることなくたとえば、ファイル名の 3 番目の文字「o」(ASCII 6f
、U+006F) を Unicode 文字「U+03FB ギリシャ小文字オミクロン」に置き換えて、「ο」のように表示すると、hexdump -C
次のようになります。
00000000 43 6c ce bf 6e 31 39 31 38 4b 5f 50 43 43 31 2e |Cl..n1918K_PCC1.|
00000010 67 66 66 |gff|
3 番目の文字は UTF-8 シーケンス としてエンコードされce bf
、各バイトの 8 番目のビットが設定されています。これがこの場合のトラブルの兆候です。また、hexdump
7 ビット ASCII のみをデコードする が単一の UTF-8 文字をデコードできず、代わりに 2 つの印刷できない文字 ( ) が表示されることに注意してください..
。
答え2
nautilus でファイル名を変更してみてください。ただし、希望する名前を入力してください (コピー アンド ペーストしないでください)。これで、すべての特殊文字が確実に削除されます。ファイル名の前後にあるスペースは、ユーザーには見えなくても、OS やプログラムには見える場合があります。私は通常、mc を使用して、本当に奇妙なファイル名に対処します。
答え3
ルートキットの存在について考えたことはありますか? 昔、ルートキットがインストールされた Solaris マシンにアクセスしたことがあります。 '*01' という名前のファイルは または では表示されませんでしたls *01
がls -altr
、 では表示されましたecho *01
。ルートキットのインストールが変更されたls
ため (および他の実行可能ファイルもいくつか)、特定のファイルとプロセスが通常の状況では表示されませんでした。あなたの説明は、私が遭遇したルートキットとよく似ています。
答え4
誰かがこれを偶然見つけて他の回答を読んだ場合...できたいくつかの回答にあるように、多くの困難を乗り越えたり、ワイルドカードで賭けたり、あるいは単にls -b
「バイナリ」として覚えておくか、のいずれかを使用します。
シェルのタブ補完では文字が自動的に引用符で囲まれるはずですが、シェル以外のもの (Nautilus など) を使用するか、シェル エスケープ引用符スタイルを使用して、ls
他のコマンドに便利な引用符付き文字列を生成することができます。この奇妙なファイルの例は、別の長い回答でも使用しましたが、ここでも関連しています。
sauer@lightning:/tmp/test> ls
a??file
sauer@lightning:/tmp/test> ls --quoting-style=shell-escape
'a'$'\t\033''file'
sauer@lightning:/tmp/test> mv -v 'a'$'\t\033''file' regular_filename
renamed 'a'$'\t\033''file' -> 'regular_filename'