批量重命名文件夹中所有具有无效 NTFS 文件名(以空格结尾)的文件

批量重命名文件夹中所有具有无效 NTFS 文件名(以空格结尾)的文件

我得到了一个文件夹,其文件名以空格结尾(扩展名之后),如下所示:

"File.txt "

当然,Windows 不喜欢我重命名/删除/移动文件。我注意到我可以使用 Winrar 或其他第三方应用程序手动重命名每个文件

有没有办法可以批量重命名所有文件?

答案1

(优秀的)共享软件程序总指挥官可以处理这个问题。

为了测试,我在 Windows 目录中使用 WSL 创建了一堆扩展名末尾带有空格的文件:for N in {1..20}; do touch "text$N.txt "; done

这导致:

drwxrwxrwx 1 user user 4096 Oct 18 20:52  ./
drwxrwxrwx 1 user user 4096 Oct 18 20:47  ../
-rwxrwxrwx 1 user user    0 Oct 18 20:52 'text1.txt '*
-rwxrwxrwx 1 user user    0 Oct 18 20:52 'text10.txt '*
-rwxrwxrwx 1 user user    0 Oct 18 20:52 'text11.txt '*
-rwxrwxrwx 1 user user    0 Oct 18 20:52 'text12.txt '*
-rwxrwxrwx 1 user user    0 Oct 18 20:52 'text13.txt '*
-rwxrwxrwx 1 user user    0 Oct 18 20:52 'text14.txt '*
etc...

我在 Windows 资源管理器中检查,它无法重命名任何这些文件。

解决:

  • 打开 TotalCommander(有一个便携版如果你想)
  • 导航到相关文件夹
  • 选择所有要重命名的文件
  • 通过打开重命名工具文件 -> 多重重命名工具...
  • 在该工具中选择正则表达式复选框,搜索$([空格][美元符号])并将其替换为<Clear>(=无): 在此处输入图片描述
  • 按下后开始!文件名末尾的所有空格都被删除,Windows 资源管理器可以再次处理这些文件。

答案2

只要你知道如何,PowerShell、cmd 和大多数其他 Win32 应用程序都可以与该文件交互\\?\使用前缀绕过 Windows 名称规范化

PS D:\空间>1..20 |% { 新项目 -Path "\\?\D:\space\test$_.txt " }

PS D:\空间>获取子项 |% {'"' + $_.Name +'"'}
“测试1.txt”
“测试10.txt”
“test11.txt”
“test12.txt”
“test13.txt”
...
“测试8.txt”
“测试9.txt”

PS D:\空间>获取子项 |% {
    重命名项目(“\\?\$PWD\”+$_.Name)($_.Name.SubString(0,$_.Name.Length - 1))}

PS D:\空间>获取子项 |% {'"' + $_.Name +'"'}
“测试1.txt”
“test10.txt”
“test11.txt”
“test12.txt”
“test13.txt”
...
“test8.txt”
“test9.txt”

在 cmd 中你也可以做同样的事情

D:\空间>对于/l %i在(1,1,10)中执行@echo%i>“\\?\D:\space\%i.txt”
D:\空间>福尔菲斯

“1.txt”
“10.txt”
“2.txt”
“3.txt”
“4.txt”
“5.txt”
“6.txt”
“7.txt”
“8.txt”
“9.txt”
D:\空间>对于/l %i 在(1, 1, 10)中执行@ren "\\?\D:\space\%i.txt " "%i.txt"

D:\空间>福尔菲斯

“1.txt”
“10.txt”
“2.txt”
“3.txt”
“4.txt”
“5.txt”
“6.txt”
“7.txt”
“8.txt”
“9.txt”

简而言之,NTFS 完全符合 POSIX 标准,可以包含除/NUL 之外的任何字符的名称。但 Win32 命名空间受到的限制要多得多,使用普通 Win32 API 的 Win32 应用程序无法访问在 Win32 命名空间中无效的名称的文件,这些名称包括以空格或句点结尾的名称

不要以空格或句点结尾文件或目录名称。虽然底层文件系统可能支持此类名称,但 Windows shell 和用户界面不支持。不过,可以将句点指定为名称的第一个字符。例如“.temp”。

命名约定

前缀\\?\将名称直接发送给驱动程序,这使我们能够对名称无效的文件进行操作,或者路径很长的文件. 许多工具,如 7z、winrar、robocopy、TotalCommander... 都知道如何添加前缀\\?\,以便处理这些文件,但对于普通工具,您需要自己添加前缀

事实上,PowerShell Core 也会\\?\在各个地方自动使用,而不像 PowerShell 5.1 及更早版本那样,你必须自己执行这些操作。但这里或那里仍存在一些错误,因此有时你必须删除\\?\并让 PowerShell Core 自行执行这些操作

有很多相关且重复的问题:

相关内容