use*_*882 6 ls filenames files
我对系统 fedora 12 中单个纯文本文件的问题感到非常困惑。我使用生物信息学中的一个已知软件 maker 来生成大量纯文本文件,其中一个似乎“无法访问”。
特别是,Clon1918K_PCC1.gff
当我使用ls, ls -a, ls -li
... 命令时会列出我的文件命名,但是当我尝试通过cat, vim, cp, ls
etc访问它时,它总是出现相同的错误Clon1918K_PCC1.gff: No such file or directory
。
但是,当我使用cp *.gff
或cp *
此文件复制所有文件时,它也会被复制。
此外,我尝试使用 nautilus 毫无问题地打开它,在两种情况之一中,当我将内容复制到另一个同名文件时,问题就消失了。有趣的是,在这种情况下,奇怪的文件不会被重写,并且会出现 2 个完全相同名称的文件,其中一个可以访问,另一个无法访问。我寻找隐藏的字符,但似乎一切正常。
有人对这个奇怪的案例有任何想法吗?谢谢!
同一个目录中不能有两个同名的文件。根据定义,文件名是唯一键。
你所拥有的几乎可以肯定是一个特殊的角色。我知道你检查过它们,但究竟是如何检查的?你可以说类似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 字符,..
而是显示两个不可打印的字符 ( )。