有没有一种方法可以将文件重命名为小写?


63

我需要一种将文件夹和子文件夹中的所有文件重命名为小写的方法。

我想知道是否有一种方法可以使用Windows(XP或7)


Windows无法像Unix一样区分大小写。也许,如果您说了为什么需要它,它将有助于解决问题。
Rook

1
@Idigas。抱歉,但是自NTFS起,文件名区分大小写。请参阅support.microsoft.com/kb/100625
DaveParillo,2009年

太好了 采取一个坏主意,并将其进一步传播。当某人发送文件并且发了粗手指错误时,支持人员的噩梦意味着他们发送了“ Answers.dat”,而传入进程期望“ answers.dat”。完全没有理由将这两个名称视为“不同”。
David

2
@David,例如Java实际上需要区分大小写的文件名。在不区分大小写的文件系统上,这可能会带来很多麻烦。
Arjan

10
我知道这很古老,但是我想在这里澄清一个误解。尽管NTFS支持区分大小写,但Windows操作系统却不区分!
2013年

Answers:


122

转到目录并运行以下命令:

for /f "Tokens=*" %f in ('dir /l/b/a-d') do (rename "%f" "%f")

如果有人要修改/改进,这是细分:

  • for /f -每行
  • "Tokens=*" -处理每一行中的每个项目。
  • %f in (...)- %f是每个项目的变量名。
  • dir -列出目录中的每个文件和子目录。
  • /l- (dir的参数)使用小写字母。
  • /b- (dir的参数)使用纯格式,仅使用文件/目录名称,没有大小,没有标题。
  • /a-d- (参数DIR)难道列出目录a代表attribute-代表notd代表directory
  • rename "%f" "%f"-使用自己的名称重命名该文件,该名称实际上是由dir命令和/l组合键小写的。

7
递归版本:(for /f "Tokens=*" %f in ('dir /l/b/a-d/s') do (rename "%f" "%f")将/ r添加到dir)。
Sawny

3
这真是太棒了
Shir Gans

4
递归版本对我不起作用-重命名抱怨该命令格式无效。原来/ s导致第二个文件被列为绝对路径,并且使用文件名扩展名(%〜nxf)给了我原始的大写文件名。最终只是手动递归。
Dogmatix

3
这是一个很好的答案。到目前为止,不需要外部程序,不需要任何小命令,也不需要复杂的批处理文件。
Jeff Wilbert

2
可以修改成将小写改为大写吗?
Chucky

18

spacetornado重命名器是一个Windows程序,可以批量重命名大量文件。您可以搜索和替换文本,删除一定数量的字符,将大小写更改为小写,大写或首字母大写,并将文本添加到每个文件名的开头或结尾(添加/添加)

在此处输入图片说明


1
请给我拒绝投票的理由?

5
不幸的是,人们很少解释:/
Gnoupi

7
我猜这是因为OP需要一种无需任何其他软件就能工作的解决方案。我猜没有解释下降票,因为有些人倾向于报复下降票。
innaM

GUI有点时髦,但是比我在此看到的其他几个重命名器做得更好。
jcollum

1
当我需要递归重命名以清理Linux FTP服务器中的文件时,它做了它所做的事情……但是,在正常工作之前,需要以Admin身份运行它。感觉就像一个古老的未维护的程序:)
尼尔森

12

从Windows 7开始,您可以使用PowerShell执行这些任务

Get-ChildItem "C:\path\to\folder" -recurse | 
  Where {-Not $_.PSIsContainer} | 
  Rename-Item -NewName {$_.FullName.ToLower()}

-选择您的根文件夹
- 重命名根文件夹和子文件夹中的所有文件
-文件夹名称用 Where {-Not $_.PSIsContainer} |


7

这是仅使用实际有效的本机cmd.exe命令的正确递归命令行解决方案。我相信这是最简单的本地解决方案:

for /r %D in (.) do @for /f "eol=: delims=" %F in ('dir /l/b/a-d "%D"') do @ren "%D\%F" "%F"

如果您愿意使用本机cmd.exe命令,那么另一个选择是我的JREN.BAT正则表达式重命名实用程序,该实用程序支持将名称转换为大写或小写的选项。它是纯脚本(混合JScript /批处理),可从XP开始在任何Windows计算机上本机运行-无需第三方exe文件。内置的完整文档-通过命令行从命令行访问jren /?,或者jren /??如果要分页输出。

使用JREN,递归解决方案非常简单:

jren "^" "" /s /l

1
效果很好。仅供参考,删除该/a-d开关,它也将小写文件夹名称。
基思(Keith)

尝试将其保存为批处理文件,然后将其弹出到system32中,因此我可以随时使用单个命令运行它。结果如下:" D"') was unexpected at this time.作为直接命令运行它可以正常工作,而作为批处理文件运行时则不起作用。不确定如何使其作为批处理文件工作,但我想直截了当地解决这个问题。
Don Cullen

1
@DonCullen-这是标准语法,在批处理脚本中使用FOR时,必须将FOR变量百分比加倍。因此%D必须更改为%%D,如果将命令放入批处理脚本中%F%%F则必须更改为。
dbenham

每天都要学习新东西。谢谢!
Don Cullen

6

我个人最喜欢的批处理文件重新命名实用程序是Cylog的WildRename。在许多其他功能中,它可以更改文件名的大小写。关于WildRename最好的事情可能是它支持正则表达式!


安装10秒钟后,这是正确的应用程序。我递归配置并重命名了一个远程文件夹(为方便起见已映射)。
Matteo Conta

5

接受答案的“递归”版本(有效*)

for /f "Tokens=*" %f in ('cmd /c "echo %cd%& dir /l/b/ad/s"') do (for /f "Tokens=*" %g in ('dir /l/b/a-d "%f"') do (rename "%f"\"%g" "%g"))


第一个循环

for /f "Tokens=*" %f in ('cmd /c "echo %cd%& dir /l/b/ad/s"')

获取当前(包括它)内所有目录的绝对路径的列表:

C:\ Foo>

  • C:\ Foo \ TO.txt

  • C:\ Foo \ Bar \ LOWER.txt

  • C:\ Foo \ Bar \ Baz \ CASE.txt


第二循环

for /f "Tokens=*" %g in ('dir /l/b/a-d "%f"') do (rename "%f"\"%g" "%g")

获取所有的列表文件名(或文件目录名,如果你拿出/a-d开关)内部各的绝对路径被发现的第一个循环,并转换这些文件以小写的名字。

  • C:\ Foo \ TO.txt

  • C:\ Foo \ Bar \ LOWER.txt

  • C:\ Foo \ Bar \ Baz \ CASE.txt


*它需要两个循环,因为to的第二个参数rename必须是文件名,而不是绝对路径(如通过/s开关获取的路径)。


你为什么cmd /c "echo %cd%& 要先进入for?完全没有必要。
DavidPostill

@DavidPostill echo %cd%可以将当前文件夹添加到绝对路径列表中;并cmd /c进行&合并命令的工作。我对Windows批处理脚本一无所知;如果您知道更好的方法,请随时改善答案!
wc.matteo

菜鸟的出色工作。Yours是第一个实际可用的本机cmd.exe命令行解决方案,不同之处在于名称以空格或分号开头时会失败。请参阅我的答案,以获取更简单的答案,该答案也可以与前导空格或分号一起使用。
dbenham '16

可以修改此值以将较低的金额转换为上限吗?
里沙夫

3

您可以使用“字符替换”策略...

set Name=%Name:A=a%
set Name=%Name:B=b%
set Name=%Name:C=c%

...等等,对于字母AZ。您可能可以以FOR循环的形式实现它。



1

http://windowsitpro.com/articles/index.cfm?articleid=81612

我仅使用标准命令编写了LwrCase.bat和LwrCase_Folder.bat脚本,以将文件名重命名为小写,或将文件夹中的所有文件名重命名为小写。

要将文件名重命名为小写,请使用:

[call] LwrCase FullyQualifiedFileName

其中,FullyQualifiedFileName是要重命名的标准文件名。

要重命名目录中的所有文件名,请使用:

[call] LwrCase_Folder FullyQualifiedDirectoryName [/S]

其中,FullyQualifiedDirectoryName是完全限定的文件夹路径,/ S是可选参数,该参数还将重命名所有子文件夹中的文件名。

注意:LwrCase.bat使用DIR命令的/ L开关,该命令返回小写名称。

LwrCase.bat包含:

@echo off
if {%1}=={} @echo Syntax: LwrCase FullyQualifiedFileName&goto :EOF
if not exist %1 @echo LwrCase - %1 NOT found.&goto :EOF
setlocal
for /f "Tokens=*" %%a in ('@echo %~a1') do (
 set file=%%a
)
if /i "%file:~0,1%" EQU "d" @echo LwrCase - %1 is NOT a file.&endlocal&goto :EOF
for /f "Tokens=*" %%f in ('dir %1 /L /b /a /a-d') do (
 Rename %1 "%%f"
)
endlocal

LwrCase_Folder.bat包含:

@echo off
if {%1}=={} @echo Syntax: LwrCase_Folder FullyQualifiedDirectoryName&goto :EOF
if not exist %1 @echo LwrCase_Folder - %1 NOT found.&goto :EOF
setlocal
for /f "Tokens=*" %%a in ('@echo %~a1') do (
 set folder=%%a
)
if /i "%folder:~0,1%" NEQ "d" @echo LwrCase_Folder - %1 is NOT a folder.&endlocal&goto :EOF
pushd %1
set sw=/B /A /A-D
if /i {%2}=={/S} set sw=%sw% %2
for /f "Tokens=*" %%f in ('dir %sw%') do (
 call LwrCase "%%f"
)
popd
endlocal

1

在Windows中执行此操作的最佳程序是Bulk Rename Utility。这是一个勒芒工具。您甚至可以使用正则表达式来重命名文件和/或文件夹。它还具有外壳程序集成(因此您可以右键单击从资源管理器执行),这非常好。提供64位和32位版本。


1

loftysnake对此问题的可接受答案适用于当前目录,但不搜索子文件夹。  Sawny建议对loftysnake的答案 进行简单的修改以使其递归,但是它不起作用,因为尽管该rename命令允许您使用filename1(源)指定文件名和驱动器,而filename2(目标)必须只是文件名。要引用帮助(/?)消息,

…您不能为目标文件指定新的驱动器或路径。

但是move可以在rename不起作用的地方工作,因此您可以使用以下命令将文件递归重命名为小写:

for /f "Tokens=*" %f in ('dir /l/b/a-d/s') do (move /y "%f" "%f")

因为事实证明,它Move可以应付目录路径。

直接在命令提示符(CMD.EXE)中输入上述命令即可使用。如果要在批处理(.BAT)文件中执行此操作,则必须将%字符加倍:

for /f "Tokens=*" %%f in ('dir /l/b/a-d/s') do (move /y "%%f" "%%f")

而且您可能可以省略括号和,/y 然后说“公正” do move …


如果您要重新发布别人已经发布的信息,则应标识原始作者并链接到他们的帖子。
斯科特,

抱歉,但是我指出moverename不起作用的地方起作用,我认为我是唯一建议在此使用该move命令的人。我只是接受了@loftysnake和@sawny的建议,并希望可以稍微改善一下它们。
阿德里安

这很奇怪; 我以为有人提到过move,但现在找不到。
斯科特,

0

递归解决方案。将其放入recursiverename.cmd文件中。

for /f "Tokens=*" %%f in ('dir /l/b/a-d') do (rename "%%f" "%%f")
for /r /d %%x in (*) do (
    pushd "%%x"
    for /f "Tokens=*" %%f in ('dir /l/b/a-d') do (rename "%%f" "%%f")
    popd
)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.