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

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

69036 次浏览

如果你对终端感到满意:

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

    for f in *; do mv "$f" "$f.tmp"; mv "$f.tmp" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done
    
  4. To confirm that all your files are lowercased, type ls and hit enter again.

(Thanks to @bavarious on twitter for a few fixes, and thanks to John Whitley below for making this safer on case-insensitive filesystems.)

这个问题很笼统,也很重要,所以我想提供一个更笼统的答案:

最简单的情况(大多数情况下是安全的,在 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 的文件系统不区分大小写,保留大小写。

但是,没有必要创建临时文件,正如已接受的答案和注释中所建议的那样,因为两个仅因大小写不同而不同的文件名首先不能存在,即 裁判

为了表明这一点:

$ 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

鱼壳版本:

for old in *
set new (echo $old | tr '[A-Z]' '[a-z]')
mv $old $new
end

对于那些想在 工作目录及子目录中将 < strong > all文件 小写的用户:

# lower case all files in current dir & subdirs
for d in ./**/ ; do (cd "$d" &&  for x in ./*/ ; do (cd "$x" && for f in *; do mv "$f" "$f.tmp"; mv "$f.tmp" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done); done); done


#list all directories
for f in ./**/ ; do echo $f; done


# lower case all files in a directory
for x in ./*/ ; do (cd "$x" && for f in *; do mv "$f" "$f.tmp"; mv "$f.tmp" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done); done

一个简单的解决方案是在 for 循环中使用 tr命令。

for file in ./* ; do
mv "$file" "$(tr '[:upper:]' '[:lower:]' <<<"$file")"
done

你可以在这里了解更多关于 tr命令的信息