我已经将一些视频保存在我的 Linux 系统可以正常查看的外部 NTFS 驱动器上。
当尝试将 macOS 用于相同目的时,我正在寻找的文件夹完全丢失了。当时我没有 Linux 计算机,因此我尝试使用朋友的运行 Windows 10 的计算机访问该文件夹。
该文件夹在 Windows 10 上可见,但视频无法播放,并显示以下错误:
“……目录名无效。”
也就是说,可以将视频复制到 Windows 内部驱动器并从其播放。
稍后尝试重命名 Windows 中的文件夹,我收到以下消息:
“这不再位于“/media/cip/TOSHIBA_1TB/CINEMA/American_canada-australia/Charlie Chaplin”中,请验证项目位置并重试。”
文件夹路径没有奇怪的字符(无论如何我都会重命名Linux中路径的所有文件夹并报告回来)。一些视频文件的法语名称带有重音字符,但这应该不是问题:Mac 全是法语,所有文件和文件夹都是法语,其他外部驱动器的法语文件和文件夹是可访问的。
可能是什么原因?可以做些什么来让它们在 macOS 系统上可见?
我用另一个 macOS 系统再次测试,仍然看不到该文件夹。将尝试在 Windows 上再次测试并尽可能更新。
编辑:我已从标题中删除了 NTFS 引用,因为该问题在具有其他类型格式的驱动器上重现。
我发布这个答案只是为了说明问题是如何解决的,从而总结了对原始问题的评论,这可能对其他人有用。
我已经解决了在 Linux 中创建这些文件夹的问题,只需缩短两个或三个视频文件的标题,这些文件的名称很长,但没有明显奇怪的字符,如逗号、括号等。我也更改了文件夹名字——尽管它们并没有什么特别之处。将它们改回来并没有重现问题。
因此,文件夹名称有一些错误字符在 Linux 上不可见,或者三个重命名文件中的一些错误字符使整个文件夹在 Mac 中不可见,并且其所有包含在 Windows 中都无法播放。
这是最奇怪的事情,在重命名文件夹和三个文件之前,没有一个文件可以在 Windows 中播放。
正如@Giacomo1968 在评论中所说:
问题是,在解决问题之前,我尝试在 Windows 中播放其他文件,而不是最终重命名的文件。幻影字符也可能在文件夹名称中。
它再次发生在一个格式化为 exFAT 的新驱动器上,并且文件夹中的其他文件在复制过程中 Nemo 文件管理器在 Linux 中报告了错误(类似于“无法创建文件”),但实际上一切看起来都很好Linux。该文件夹已被看到,但在 Windows 中仍然完全无法访问(我不完全记得错误消息,关于文件或文件夹不存在的内容),并且在 Mac 上可以看到,除了一个文件,它仍然不可见。在Linux中重命名文件夹和同名文件后一切正常!
我现在怀疑问题中报告的初始问题的原因以及错误“幻像”字符的创建是复制过程中的一些错误或粘贴从互联网页面复制的文本标题(看起来像例如,空间实际上是别的东西)。这是因为在 Linux 中使用 Double Commander 进行复制时,它报告了一些名称的详细错误,其中包括可能是制表符或类似字符的空格。
(为了避免从互联网上复制/粘贴所选文本时出现此类错误,类似Firefox 的“仅复制文本”插件可能非常有用。)
最后,复制的最佳解决方案是在Linux中使用Double Commander,它非常清楚地指出了有问题的文件名。
命名文件或文件夹时必须谨慎复制/粘贴 Internet 文本。
微软网站上讨论了文件/文件夹名称在 Windows 上的工作方式。然而,这仅提供了整体真相的一瞥。
至于文件系统,我将自己限制为 NTFS,就像问题一样。考虑来自上述链接网站的以下评论:
现在,我们需要先弄清楚一些术语。我们处理各种......层,可能是一个合适的术语:
(如果您想查看它,请使用WinObj 之类的工具)
一个很好的解决方法是在客户端伪装成 NTFS 的 Samba 共享。但 Windows NTFS 卷也可以。我们将在 Windows 上从命令行“玩转”(点击Win+R并键入
cmd
,然后点击Enter)。本地 NTFS 卷
假设我们想要创建一个无效的文件名(注意尾随的点?!):
尝试这样做时,结果确实是
test.txt
,而不是test.txt.
。Win32 子系统 (csrss.exe) 阻止我们做愚蠢的事情。嗯,有意思吧?考虑另一个声明:
嗯,
NUL
听起来很有趣。我们知道这是/dev/null
从 DOS 时代继承而来的 unixoid 系统的替代品。啊对。它是 的替代品
/dev/null
,因此输出将被吞噬。但不要使用如此诱人的声音。因此,让我们使用零项目博客文章“本地设备”部分中总结的信息。正如我们可以从零项目一文中了解到的,有许多方法可以在 Win32 子系统级别避开路径名称转换。一种这样的方法是在
\\?\
内部直接转换为 的前缀\??\
,在较新的 Windows 版本上与\GLOBAL??\
. 这称为对象目录(请不要将其与文件系统实体混淆,尽管术语相似!)。同样,WinObj 和类似的工具可以让您调查对象管理器名称空间。所以我们的目标是创建一个名为的文件(或目录)
NUL
,而 Win32 子系统不允许我们这样做。它只是吞下了输出,并且从未在我们的工作目录中创建该文件。然而,利用上述链接文章和前一段插曲中的信息,我们可以通过在子系统级别回避那些讨厌的路径转换来解决这个问题,方法是发出:提醒一下,
%CD%
扩展为当前工作目录的绝对路径,假设是C:\test
,上面的命令相当于echo NONSENSE > \\?\C:\test\NUL
.你瞧,快速
dir
证明文件已创建。如果我们尝试使用其他“保留”名称,它也可以正常工作。请注意,您也可以使用实际的原生 NT 路径形式(
\??
而不是\\?
)来获得相同的效果:整洁的。
那么我们如何重新审视尾随点的尝试,但在没有 Win32 子系统干扰的情况下给出完整路径?:
瞧,它有效,快速
dir /b
证明:现在我们终于创建了一个“不可能”的文件
test.txt.
,让我们看看它,好吗?有没有搞错?我清楚地记得曾回响
ILLEGAL TRAILING DOT
到该文件中。啊,当然。就像我们最初尝试创建
test.txt.
Win32 子系统时再次干预并“有帮助地”将我们的名称转换为test.txt
. 所以我们实际上是在看\??\%CD%\test.txt
而不是\??\%CD%\test.txt.
.所以这应该这样做:
好多了。问题在于,并非所有程序都能像
cmd.exe
. 假设我们要打开记事本:Dang,我们会看到以下消息框:
因此,虽然有一些方法可以规避Win32 子系统施加的一些限制,但这些方法的效用是有限且值得怀疑的。
注意:也在 Windows 上/为 Windows开发软件的读者可能还记得,使用
\\?\
允许回避MAX_PATH
限制的前缀(过去是 260,基本上是 255 plus\\?\
和终止\0
)。现在您知道为什么这允许我们使用大约32767 个字符了。由于 UCS-2 被 UTF-16 取代(我认为在 XP 中),对象管理器级别的路径修改只是一个问题。另一个是,在 UTF-16 中,一旦您将BMP抛在后面,代码点可能会占用超过 16 位(又名wchar_t
或) 。WCHAR
无论如何,命令行 (
cmd.exe
) 为您提供了访问和删除最初能够从 Windows 创建的文件的所有工具。Linux/Samba 共享,伪装成 NTFS
现在让我们从本地驱动器出发,考虑一个映射的网络驱动器
Z:
,它由 Samba 4.x 提供,就 Windows 而言,它模仿了 NTFS 驱动器。这个实验提供了更多的见解,因为我们可以根据 Linux 端的规则创建文件,而不必担心无法从 Windows 端访问它们。
Z:
,我们将在Z:\test
Windows 端维基百科文章告诉我们,除了
/
and\0
(又名ASCII NUL 字符)之外的所有字符都是允许的!所以这应该很有趣。以下是一些在 Windows 端应该(或至少可能)难以访问的奢侈文件名,在 Linux 端使用 Ubuntu 20.04 上的 Bash 来创建它们:
:.txt
(创建与echo "$RANDOM" > \:.txt
)???.txt
(创建与echo "$RANDOM" > \?\?\?.txt
)?.txt
(创建与echo "$RANDOM" > ?.txt
)*.txt
(创建与echo "$RANDOM" > \*.txt
)\.txt
(创建与echo "$RANDOM" > \\.txt
)".txt
(创建与echo "$RANDOM" > \".txt
)>.txt
(创建与echo "$RANDOM" > \>.txt
)<.txt
(创建与echo "$RANDOM" > \<.txt
)|.txt
(创建与echo "$RANDOM" > \|.txt
)这应该几乎涵盖了所有基础,实际上在第二次考虑表情符号甚至可能根本不是问题。NTFS 上也禁止使用正斜杠,但对于 btrfs/ POSIX/SUS也是如此。
Linux方面的证明:
现在让我们看看在 Windows 端是否可以访问以及可以访问什么...
截图为证:
哦哦哦!没错,Windows 的 DOS 遗产再次来袭。NTFS -除非主动禁用它- 能够创建所谓的 8.3 短文件名,符合 DOS 文件名要求。
And that's how we are able to access the invalid file names regardless.
Conclusion
Now recall, the question was about an external, i.e. local, NTFS drive. This means the rules we just observed for Samba shares may not apply here.
Depending on the driver used to store these files (which could vary by Linux/macOS version, e.g. ntfs-3g or the third-party driver used, e.g. Paragon's driver) I see the following possible causes left after looking at the above experiments:
:
,"
or?
... this seems the most likely to me, given I'd had accidentally copied and pasted ebook titles myself, containing these characters. We can pretty much rule out/
and the other "forbidden" characters are at least less likely.对于第一种情况,我建议在 Linux 端使用fslint来清理文件(和文件夹)名称。存在其他类似的工具和 YMMV,请选择。
希望这可以帮助。花了足够长的时间将我的想法倾注到写作中。
进一步阅读