【问题标题】:How do I rename all files to lowercase?如何将所有文件重命名为小写?
【发布时间】:2011-12-08 21:04:16
【问题描述】:

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

【问题讨论】:

  • 您对终端/shell 解决方案感到满意吗?还是您希望 C/Objective-C 代码来实现这一点?
  • 终端解决就好了。
  • 我认为这应该重新打开。终端代码也是代码
  • 这应该是关于 stackoverflow 的一个有效问题。这也是代码。

标签: macos file bash


【解决方案1】:

对于那些想要将当前目录和子目录中的所有文件小写:

# 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

【讨论】:

  • 我收到-bash: cd: ./*/: No such file or directory
【解决方案2】:

鱼壳版:

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

【讨论】:

    【解决方案3】:

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

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

    但是,没有必要创建临时文件,如已接受的答案和 cmets 中所建议的那样,因为首先不能存在两个仅大小写不同的文件名,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”小写文件名。所以只有我评论了。
    • 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 -la -rw-r--r-- 1 root root 0 Jun 24 15:19 X
    • 对不起,糟糕的格式。所以在那里对我不友好。
    • 我的坏处是——在共享驱动器上的树莓派上的 ssh 中(hfsplus 格式)——它不起作用。但在我的 Mac 上本地可以。
    • for i in * ;做 j=$(tr '[:upper:]' '[:lower:]'
    【解决方案4】:

    如果您对终端感到满意:

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

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

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

    【讨论】:

    • 小心。如果您有名为 foo.txtFOO.TXT 的文件,这可能会破坏其中一个。
    • 使用 bash,您可以这样做:mv "$f" "${f,,}"declare -l g=$f; mv "$f" "$g"
    • 我尝试了所有这些命令,我​​得到“mv:‘PPP.txt’和‘ppp.txt’是同一个文件”,它没有小写我的文件......有什么想法吗?是因为在同一个目录吗?
    • user2066039:这一定是 Mac 上最近发生的事情,因为大多数超过一年的答案都没有考虑到它。我通过使用像“jpg1”这样的中间扩展来完成任务。所以,JPG -> jpg1 -> jpg。希望对您有所帮助。
    • OS X 用户应先将每个文件重命名为临时名称,因为文件系统不区分大小写,例如:for f in *; do mv "$f" "$f.tmp"; mv "$f.tmp" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done
    猜你喜欢
    • 2020-03-06
    • 2010-09-14
    • 2011-04-07
    • 2019-04-10
    • 1970-01-01
    • 2015-11-17
    • 2011-04-18
    • 1970-01-01
    • 2015-06-08
    相关资源
    最近更新 更多