在 Windows 上,win32 API 似乎不允许目录名以点 () 结尾,.
但根据在这方面提出的几个问题(例如链接1,链接2),Windows 上的解决方案是指定以 为前缀的路径,以禁用 API 端的字符串解析。这样,就可以\\?\
创建类似的目录(删除它也是如此)。\\?\C:\dotatend.
因为我想在已挂载的 NTFS 卷(挂载点/mnt/myntfsvol
)上重新创建以点结尾的文件夹,所以我想知道如何使用 Linux 来执行此操作。
我的 Linux 系统运行内核 6.7,挂载列表fuseblk
正在该挂载点上使用,它没有说明所使用的底层文件系统,但正在运行lsblk -lpno fstype "$(findmnt -no SOURCE /mnt/myntfsvol)"
(归功于福克利夫对于此嵌套命令序列)确认 FS 为ntfs
。
dotatend.
当我尝试使用以下方式在挂载点创建新目录时
mkdir '/mnt/myntfsvol/dotatend.'
, 我收到
mkdir: cannot create directory ‘/mnt/myntfsvol/dotatend.’: Invalid argument
前缀\\?\
显然不起作用,而且更改为正斜杠 ( //?/
) 也不会在目标位置创建该目录。的手册页mkdir
也没有提到某种特殊的 raw-string 前缀或类似的东西,但我猜这可能无论如何都需要在驱动程序级别解决。
关于如何在 NFTS 文件系统上创建以点结尾的目录,还有其他想法提示吗?\\?\
Linux 上是否有任何与前缀相对应的内容?
答案1
\\?\
Linux 上是否存在与该前缀对应的内容?
没有,因为其背后的整个概念在 Linux 上实际上并不存在。
Windows 上的这个前缀向 Win32 层发出指示,它应该跳过所有“类似 DOS”的转换,并将原始路径直接传递给 NT 内核。但这已经在 Linux 上发生了——不仅没有中间层禁止尾随点,而且实际上也没有中间层一般来说。
(用 Windows 术语来说,Linux 上的所有程序都直接使用“本机 API”,这是唯一存在的 API - libc 实际上是 ntdll。)
该Invalid argument
错误不是由任何中间层返回的;它实际上是由 Linux 返回的NTFS 驱动程序。有两个,分别称为“ntfs3”和“ntfs-3g”,它们都提供相同的windows_names
选项来阻止创建通常被 Win32 认为无效的文件名。
要找出正在使用的驱动程序,您需要直接查看输出findmnt
,而不是 lsblk 输出。后者仅根据设备内容报告文件系统类型,因此它将始终报告“ntfs”,而 findmnt 中的相同 FSTYPE 列将显示正在使用的驱动程序名称:
FS类型 | 司机 |
---|---|
ntfs3 |
内核 ntfs3 驱动程序 |
fuseblk |
外部 NTFS-3G 驱动程序 ( mount -t ntfs-3g ) |
ntfs |
最有可能的是,古老的内核 ntfs 驱动程序;避免使用它 |
除此之外,您还将看到 OPTIONS 列。确保它没有列出“windows_names”。如果该选项存在,请卸载文件系统并再次挂载。
答案2
u1686_grawity 的回答指出了我正确的方向,但正如那里评论的那样,即使windows_names
是不是在正在使用的挂载选项中,mkdir '/mnt/myntfsvol/dotatend.'
仍然像我的问题中描述的那样失败。
但是,手动安装卷时(不是通过gnome 磁盘实用程序和我之前做的一样),但使用相同的选项findmnt
显示(但仍然让系统选择驱动程序fuseblk
,从而再次创建以点结尾的文件夹作品突然间!
sudo mount -o rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other,default_permissions /dev/sdb1 /mnt/myntfsvol
当明确使用ntfs3通过指定-t ntfs3
,一些选项需要更改,因为它们不可用或命名不同,但即便如此, mkdir '/mnt/myntfsvol/dotatend.'
也可以工作。
我相信这个命令应该与 保险丝座以上是我使用的:
sudo mount -t ntfs3 -o rw,nosuid,nodev,relatime,uid=0,gid=0 /dev/sdb1 /mnt/myntfsvol
我仍然不明白为什么使用自动挂载功能或类似助手时行为会有所不同gnome 磁盘实用程序但至少可以在 NTFS 卷上创建以点结尾的文件夹。