奇怪的情况:存在和不存在的文本文件

use*_*882 6 ls filenames files

我对系统 fedora 12 中单个纯文本文件的问题感到非常困惑。我使用生物信息学中的一个已知软件 maker 来生成大量纯文本文件,其中一个似乎“无法访问”。

特别是,Clon1918K_PCC1.gff当我使用ls, ls -a, ls -li... 命令时会列出我的文件命名,但是当我尝试通过cat, vim, cp, lsetc访问它时,它总是出现相同的错误Clon1918K_PCC1.gff: No such file or directory

但是,当我使用cp *.gffcp *此文件复制所有文件时,它也会被复制。

此外,我尝试使用 nautilus 毫无问题地打开它,在两种情况之一中,当我将内容复制到另一个同名文件时,问题就消失了。有趣的是,在这种情况下,奇怪的文件不会被重写,并且会出现 2 个完全相同名称的文件,其中一个可以访问,另一个无法访问。我寻找隐藏的字符,但似乎一切正常。

有人对这个奇怪的案例有任何想法吗?谢谢!

Ale*_*ios 9

同一个目录中不能有两个同名的文件。根据定义,文件名是唯一键。

你所拥有的几乎可以肯定是一个特殊的角色。我知道你检查过它们,但究竟是如何检查的?你可以说类似ls *gff | hexdump -C找到特殊字符的位置。任何设置了高位的字节(即80和之间的十六进制值FF)都表示出现了问题。低于20(十进制 32)的任何内容也是特殊字符。另一个提示是.. 的右侧文本列中存在点hexdump -C

有许多字符看起来像 UTF-8 中的美国 ASCII 字符。即使在 US ASCII 中,1 和 l 通常看起来也很相似。然后,你有来自西里尔文的 C (U+0421)、希腊的 Lunate Sigma (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|
Run Code Online (Sandbox Code Playgroud)

所有这些字节值都低于0x80(第 8 位清除),因为它们都是 7 位美国 ASCII 代码点。Unicode 代码点 U+0000 到 U+007F 代表传统的 7 位 US ASCII 字符。代码点 U+0080 及以上代表其他字符,并以 UTF-8 编码为两到六个字节(在 Linux 上,请尝试man utf8获取有关如何完成的大量信息)。根据定义,UTF-8 将 US-ASCII 代码点编码为它们本身(即十六进制 ASCII 字符41,Unicode U+0041,被编码为单个字节41)。代码点?128 被编码为两到六个字节,每个字节都设置了第八位。可以很容易地检测到非 ASCII 字符的存在,而无需对流进行解码. 例如,假设我将文件名中的第三个字符 'o' (ASCII 6f, U+006F) 替换为 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|
Run Code Online (Sandbox Code Playgroud)

第三个字符现在被编码为 UTF-8 序列ce bf,其中的每个字节都设置了第 8 位。在这种情况下,这是您遇到麻烦的迹象。另请注意hexdump,仅解码 7 位 ASCII 的 无法解码单个 UTF-8 字符,..而是显示两个不可打印的字符 ( )。


SHW*_*SHW 0

在 Linux 中,同一目录中不可能有两个同名的文件。

尝试使用 vim 父目录,然后导航到“陌生人”文件,看看是否可以访问它