如何将所有文件重命名为小写?


120

例如,我有TREE.wav,ONE.WAV。我想将其重命名为tree.wav,one.wav。如何将所有文件重命名为小写?


1
您是否对端子/外壳解决方案感到满意?还是您想要C / Objective-C代码来完成此任务?

终端解决方案可以。
Voloda2 2011年

3
我认为应该重新开放。终端代码也是代码
Danield '16

1
这应该是关于stackoverflow的有效问题。这也是代码。
adev

Answers:


366

如果您对终端感到满意:

  1. 打开Terminal.app,键入cd,然后将包含要重命名的文件的文件夹拖放到窗口中。
  2. 要确认您在正确的目录中,请键入ls并按Enter。
  3. 粘贴此代码,然后按Enter:

    for f in *; do mv "$f" "$f.tmp"; mv "$f.tmp" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done
  4. 要确认所有文件均为小写,请键入ls并再次按Enter。

(感谢Twitter上的@bavarious进行了一些修复,并感谢下面的John Whitley在不区分大小写的文件系统上使此设置更为安全。)


9
小心。如果您有名为foo.txt和的文件FOO.TXT,则可能破坏其中之一。
基思·汤普森

1
使用bash,您可以执行以下操作:mv "$f" "${f,,}"declare -l g=$f; mv "$f" "$g"
glenn jackman 2011年

2
我尝试了所有这些命令,我​​得到“ MV:'PPP.txt'和'ppp.txt'是同一文件”,并且我的文件没有小写...任何想法吗?是因为它在同一目录中吗?
lorless

1
user2066039:这在Mac上必须是最新的东西,因为大多数答案都早于一年以上就无法解决。我通过使用中间扩展名(例如“ jpg1”)完成了任务。因此,JPG-> jpg1-> jpg。希望有帮助。
乔伊斯

14
由于不区分大小写的文件系统,OS X用户应首先将每个文件重命名为一个临时名称,例如: for f in *; do mv "$f" "$f.tmp"; mv "$f.tmp" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done
John Whitley 2015年

10

所提出的问题是普遍的,也是重要的,因此,我想提供一个更笼统的答案:

最简单的情况(大多数情况下是安全的,在Mac OS X上是安全的,但请继续阅读):

for i in * ; do j=$(tr '[:upper:]' '[:lower:]' <<< "$i") ; mv "$i" "$j" ; done

您还需要处理文件名中的空格(任何操作系统):

IFS=$'\n' ; for i in * ; do j=$(tr '[:upper:]' '[:lower:]' <<< "$i") ; mv "$i" "$j" ; done

在区分大小写的文件系统中,您需要安全地处理仅因大小写而不同的文件名,并且不覆盖目标文件(例如Linux):

for i in * ; do j=$(tr '[:upper:]' '[:lower:]' <<< "$i") ; [ -e "$j" ] && continue ; mv "$i" "$j" ; done 

关于Mac OS X的注意事项:

Mac的文件系统不区分大小写,保留大小写。

但是,无需按照已接受的答案和注释中的建议创建临时文件,因为两个文件名仅因大小写不同而不能存在于首位,即ref

为了显示这一点:

$ mkdir test
$ cd test
$ touch X x
$ ls -l 
total 0
-rw-r--r--  1 alexharvey  wheel  0 26 Sep 20:20 X
$ mv X x
$ ls -l 
total 0
-rw-r--r--  1 alexharvey  wheel  0 26 Sep 20:20 x

是的-但您的示例建议您可以使用'mv X x'来小写文件名。因此,只有我对此进行了评论。
cpaludan

mojave 10.14.5:#touch X x#ls -la total 0 -rw-r--r-- 1 root root 0 Jun 24 15:19 X#mv X x mv:'X'和'x'相同文件
#ls

抱歉,格式化不正确。所以那里对我不友善。
cpaludan

1
而且我的坏-在共享驱动器上的树莓派上的ssh中(格式化的hfsplus)-那里不起作用。但是在我的Mac上是本地的。
cpaludan

因为我在*; 做j = $(tr'[:upper:]''[:lower:]'<<<“ $ i”); mv“ $ i”“ $ j”; 在卡塔琳娜州为我工作。谢谢。
Sinan Eldem

2

鱼壳版本:

for old in *
    set new (echo $old | tr '[A-Z]' '[a-z]')
    mv $old $new
end
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.