几周前我使用了 Linux 的实时启动 CD,并将屏幕截图重定向到我的 NTFS 驱动器。
文件名包含冒号符号,:
该符号是 NTFS 文件系统上不支持的文件名字符之一。
不支持的字符有:\ / : * ? " < > |
我尝试使用常规命令提示符、PowerShell、一些脚本语言,甚至 Windows 上的 Bash 来解决这个问题,但都没有成功。
我什至尝试了\\?\
路径技巧,但它也不起作用。
该限制显然与 NTFS 文件系统有关,那么从这里继续的方法是什么?
几周前我使用了 Linux 的实时启动 CD,并将屏幕截图重定向到我的 NTFS 驱动器。
文件名包含冒号符号,:
该符号是 NTFS 文件系统上不支持的文件名字符之一。
不支持的字符有:\ / : * ? " < > |
我尝试使用常规命令提示符、PowerShell、一些脚本语言,甚至 Windows 上的 Bash 来解决这个问题,但都没有成功。
我什至尝试了\\?\
路径技巧,但它也不起作用。
该限制显然与 NTFS 文件系统有关,那么从这里继续的方法是什么?
重新启动到您的 linux live CD 并从那里更正它。
Windows 无法处理这个问题。这需要在 Linux 上完成。
@LPChip 的答案是解决您问题的答案,但我有更多细节,我认为这里值得另一个答案。
文件系统是管理磁盘上文件的数据结构,因此通常 FS 本身对文件名的限制很小 - 大多数现代 FS(包括 NTFS)甚至可以在技术上保存空字节,就像 Python 保存字符串(长度 + 字节数组)的方式一样。
FS 支持任意字符串并不意味着您应该支持。实际的操作系统对文件名施加限制,以便它们可以向上层提供一个合理的“路径”接口,应用程序可以在其中访问文件。
这就是每个操作系统对文件名都有一些限制的原因。值得注意的是,Linux 和其他 Unix 系统允许在文件名中使用除空字节和路径分隔符(正斜杠)之外的所有字符,不包括两个保留名称
.
和..
(当前目录和父目录)。由于历史原因,Windows 通过普通 Windows API 保留了更多字符和更多特殊名称(例如CON
、LPT
、COM1
toCOM9
等),但仍然允许通过 WSL1 使用的低级 API 来使用这些名称。例如,您可以/mnt/c/CON
在 WSL1 中创建类似的内容并正常使用它,但您无法在 WSL 环境之外对其执行任何操作。在 Linux 上,
fsck
如果程序以某种方式最终出现在文件系统中,则它们可以重写无效的文件名。我想chkdsk.exe
可以做类似的事情,但我还没有验证这一点。维基百科的侧边栏关于禁用字符的声明引用了一份文档(似乎不是官方的)。 这里有一个网页化版本。
深入研究,我们在第 13 节“概念 - 文件名命名空间”中看到,有多个允许的字符集。Windows 似乎与 POSIX 兼容得不太好。
然而,提到 DOS 类型(旧的“8.3”样式)会让人想起 Windows 在其他方法都失败的情况下处理所谓的“短名称”的能力。您应该能够使用
cmd
提示来dir /x
查看与文件禁止的“长名称”相对应的短名称。可以使用该“短名称”将文件重命名为问题较少的名称。请告诉我们进展如何!