奇妙な状況:テキストファイルが存在しますが存在しません。

奇妙な状況:テキストファイルが存在しますが存在しません。

私のシステムFedora 12の単一のプレーンテキストファイルの問題について完全に混乱しています。私はバイオインフォマティクス分野で知られているソフトウェアであるMakerを使用して多数のプレーンテキストファイルを生成しましたが、そのうちの1つは「アクセスできない」ようです。

Clon1918K_PCC1.gff具体的には、...コマンドを使用するls, ls -a, ls -licat, vim, cp, ls私のファイルが一覧表示されますClon1918K_PCC1.gff: No such file or directory

ところで、すべてのファイルcp *.gffcp *このファイルをコピーすると、同じようにコピーされます。

私は問題なくノーチラスで開いてみましたが、どちらの場合でも、内容を同じ名前の別のファイルにコピーすると問題がなくなりました。興味深いことに、この場合、奇妙なファイルは書き直されず、まったく同じ名前の2つのファイルが現れました。 1つはアクセス可能で、もう1つはアクセスできません。隠されたキャラクターを探してみるのに、すべてが大丈夫だと思います。

この奇妙な出来事について考えている人はいますか?ありがとうございます!

答え1

同じディレクトリに同じ名前の2つのファイルを含めることはできません。定義によると、ファイル名は一意のキーです。

あなたが持っているのはほとんど確かに特別な性格です。あなたがそれを確認したことを知っていますが、正確にはどうですか?ls *gff | hexdump -C特殊文字がある場所を探してみてください。高いビットが設定されたバイト(たとえば、80間の16進値などFF)は問題を示します。下20(10進数32)も特殊文字です。もう一つのヒントは、.右側のテキスト列にドットがあることです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はシングルバイトでエンコードされます41。コードポイント≧128は2〜6バイトでエンコードされます。それぞれは8番目のビットが設定されています。。これにより、ASCII以外の文字の存在を簡単に検出できます。ストリームをデコードする必要はありません。。たとえば、ファイル名の3番目の文字「o」(ASCII、U + 006F)を6f「ο」などのUnicode文字「U + 03FB GREEK SMALL LETTER OMICRON」に変更するとします。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番目のビットが設定されます。この場合は、困っているという信号です。また、hexdump7ビットASCIIデコードのみが単一のUTF-8文字デコードに失敗し、印刷できない2つの文字(..)を表示します。

答え2

Nautilusを使用してファイル名を変更し、必要な名前を入力します(コピーして貼り付けないでください)。これにより、特殊文字が確実に削除されます。ファイル名の前後にスペースがあり、ユーザーには見えませんが、オペレーティングシステムとプログラムには表示されます。私は通常本当に奇妙なファイル名を作成するときにmcを使用します。

答え3

ルートキットの存在を考えたことがありますか?昔々、私はルートキットがインストールされているSolarisコンピュータにアクセスできました。ls *01またはを使用すると、「* 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'

関連情報