文件夹命名为'*'

翻看旧硬盘时,我发现了一个名为*的文件夹:

star

我无法从Windows打开、访问或重命名它。

windows error

我尝试通过Moba Xterm访问它,但是遇到了问题。
ls -l
ls: ./*: No such file or directory

cp \* star
cp: can't stat '*': No such file or directory

这个文件损坏了吗?有没有办法修复它?

8试着用单引号将其称为 '*',否则它会被视为通配符。 - Tetsujin
13这是Windows,所以问题在于它被视为通配符的一个不同层次,而不是引号解释的地方。在Bash shell级别,反斜杠就足够了。但是ls命令已经直接从readdir()获取了字面字符串*并将其传递回内核,而cp错误消息也显示它尝试访问一个字面的*(因此通配符扩展没有发生,多亏了反斜杠),然而两者都得到了操作系统的“否定”回应。 - user1686
3个回答

* 是 Windows 文件名中不允许的字符之一(因为在 Windows 上,通配符扩展是由文件系统完成的)。然而,在 NTFS 中,它通常是被允许的,所以拥有这样的目录并不意味着文件系统损坏,只表示该目录是使用另一个操作系统创建的。
尝试使用 Cmd 中的 \\?\ NT 路径对其进行重命名。
move \\?\E:\██████████████\* \\?\E:\██████████████\badfolder

如果这样做没有帮助,请将磁盘连接到运行Linux的系统上,或者尝试通过WSL访问它。即使使用WSL1也可能有效,因为它绕过了所有高级别的Windows API。

(在MobaXterm或git-bash等工具中找到的Windows版本的Linux工具不会有太大帮助,因为它们最终仍然是普通的Windows程序,并受到相同的限制。另一方面,WSL1和旧的Interix/SfU工具是与Win32完全不同的"子系统",只共享内核,但不受文件名限制的影响。)


9移动命令似乎没有起作用。 通过Linux操作系统访问它解决了问题。非常感谢您的帮助! - parakmiakos
2我猜在Cygwin中通过命令行也可以工作。 - Carl Witthoft
2@CarlWitthoft:Cygwin程序最终仍然只是Windows程序,在WinAPI之上实现了POSIX API,除非我弄错了。与WSL1不同,它没有内核支持,这就是为什么它对类似fork()的系统调用的模拟如此昂贵的原因。这个答案已经解释了通过WinAPI来实现是行不通的。 - Peter Cordes
1@PeterCordes 错了,我不确定具体的实现细节,但我经常使用Cygwin来解决Windows特定的问题,就像这样的问题已经有好几年了。而且它比WSL1甚至WSL2快得多。 - Hashim Aziz
1@HashimAziz:谢谢;多年来我对Cygwin了解不多(因为我根本不需要使用Windows),另一次搜索发现它在可能的情况下使用NT系统调用而不是WinAPI。关于性能表现良好:当然。对于大多数情况来说,fork()并不是瓶颈,而且那些与Windows系统调用相匹配的任务也没有问题。(有些情况下,生成新进程的用例可以将fork+execve作为一个单一操作来执行,Windows可以处理。https://cygwin.com/cygwin-ug-net/highlights.html仍然提到fork()很棘手) - Peter Cordes
2不需要使用其他操作系统,WinApi的NtCreateFile 忽略了特定的Windows限制,允许您创建名为*的文件/文件夹(为什么?不知道...) - hanshenrik
根据我所知,更准确地说是“NT API”,而不是“Win32 API”——我猜测它忽略了这些限制,因为它也被Interix(又名SFU,又名旧的POSIX子系统,又名WSL的前身)使用过。 - user1686

虽然听起来你最终通过使用WSL解决了这个问题,但我认为你可以在不安装WSL/Cygwin的情况下通过使用文件夹的8.3短名称来处理这个问题。
要从资源管理器中获取当前目录的cmd提示符,你可以在“文件”菜单中使用“打开Windows Powershell”选项,然后在shell中输入cmd以切换到cmd.exe

Open Windows PowerShell

运行dir /x命令来列出当前目录的内容,并获取名为*的文件夹的短名称,然后通过其短名称来重命名它。
我使用WSL在我的Windows文件系统上创建了一个名为*的文件夹,然后按照上述步骤确定了它的DOS兼容短名称(在这种情况下是21BA~1),然后使用cmd.exe将其重命名为star
PS C:\Users\Nick\Scripts> cmd
Microsoft Windows [Version 10...]
(c) Microsoft Corporation. All rights reserved.

C:\Users\Nick\Scripts>dir /x
 Volume in drive C has no label.
 Volume Serial Number is ABCD-1234

 Directory of C:\Users\Nick\Scripts

03/11/2022  05:26 PM    <DIR>                       .
03/11/2022  05:26 PM    <DIR>                       ..
10/10/2020  04:30 PM             1,225 PORT-F~1.PS1 port-forward.ps1
03/11/2022  05:26 PM    <DIR>          21BA~1       
               1 File(s)          1,225 bytes
               3 Dir(s)  166,006,308,864 bytes free

C:\Users\Nick\Scripts>ren 21BA~1 star

C:\Users\Nick\Scripts>dir
 Volume in drive C has no label.
 Volume Serial Number is ABCD-1234

 Directory of C:\Users\Nick\Scripts

03/11/2022  05:40 PM    <DIR>          .
03/11/2022  05:40 PM    <DIR>          ..
10/10/2020  04:30 PM             1,225 port-forward.ps1
03/11/2022  05:26 PM    <DIR>          star
               1 File(s)          1,225 bytes
               3 Dir(s)  166,006,243,328 bytes free

就安装Cygwin并重命名文件夹而言,一个简单的解决方案是这样做。假设您的文件夹路径为C:\Users\hans\Desktop\*,打开Cygwin终端并输入以下命令。

cd 'C:\Users\hans\Desktop'
mv '*' 'star'

而且,你的文件夹现在被命名为“star”,而不是“*”。

  • 相关问题