我得到了一个文件夹,其文件名以空格结尾(扩展名之后),如下所示:
"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 自行执行这些操作
有很多相关且重复的问题: