如何从 Windows 上的文件名中删除不支持的字符

21 windows ntfs win32

几周前我使用了 Linux 的实时启动 CD,并将屏幕截图重定向到我的 NTFS 驱动器。
文件名包含冒号符号:,该符号是 NTFS 文件系统上不支持的文件名字符之一。

不支持的字符有:\ / : * ? " < > |


我尝试使用常规命令提示符、PowerShell、一些脚本语言,甚至 Windows 上的 Bash 来解决这个问题,但都没有成功。

我什至尝试了\\?\路径技巧,但它也不起作用。

该限制显然与 NTFS 文件系统有关,那么从这里继续的方法是什么?

LPC*_*hip 40

重新启动到您的 linux live CD 并从那里更正它。

Windows 无法处理这个问题。这需要在 Linux 上完成。

  • 这实际上是真的。 \\?\ 技巧不起作用的原因是: 意味着打开备用流,因此您要么针对 NT Native API 编写 C 代码,要么再次启动 Linux 并让它修复自己的问题。 (7认同)
  • 直到最近,处理 NTFS 的常用 Linux 驱动程序是 ntfs-3g,它具有挂载选项“windows_names”。使用该选项可以防止创建在 Windows 上造成困难的文件名。 (5认同)

iBu*_*Bug 16

@LPChip 的答案是解决您问题的答案,但我有更多细节,我认为这里值得另一个答案


文件系统是管理磁盘上文件的数据结构,因此通常 FS 本身对文件名的限制很小 - 大多数现代 FS(包括 NTFS)甚至可以在技术上保存空字节,就像 Python 保存字符串(长度 + 字节数组)的方式一样。

FS 支持任意字符串并不意味着您应该支持。实际的操作系统对文件名施加限制,以便它们可以向上层提供一个合理的“路径”接口,应用程序可以在其中访问文件。

这就是每个操作系统对文件名都有一些限制的原因。值得注意的是,Linux 和其他 Unix 系统允许在文件名中使用除空字节和路径分隔符(正斜杠)之外的所有字符,不包括两个保留名称...(当前目录和父目录)。由于历史原因,Windows 通过普通 Windows API 保留了更多字符和更多特殊名称(例如CONLPTCOM1toCOM9等),但仍然允许通过 WSL1 使用的低级 API 来使用这些名称。例如,您可以/mnt/c/CON在 WSL1 中创建类似的内容并正常使用它,但您无法在 WSL 环境之外对其执行任何操作。

在 Linux 上,fsck如果程序以某种方式最终出现在文件系统中,则它们可以重写无效的文件名。我想chkdsk.exe可以做类似的事情,但我还没有验证这一点。