【问题标题】:Linux: how to rename all files in a directory to uppercase? [duplicate]Linux:如何将目录中的所有文件重命名为大写? [复制]
【发布时间】:2015-07-29 23:22:36
【问题描述】:

包括扩展。例如 file.txt --> FILE.TXT

如果有人能指出我的大致方向,我将不胜感激:)


这里只是一些随机文本,因为 Stackoverflow 的字符数太少...

【问题讨论】:

  • 你使用的是哪个外壳?

标签: linux shell awk sed rename


【解决方案1】:

最初的解决方案是:

rename 'y/a-z/A-Z/' *

它获取当前目录中的每个文件/目录,并将 a-z 范围内的每个字符更改为其对应的大写版本。

rename 的问题是没有选项可以进入目录以递归地应用重命名,并且* 字符被扩展为当前目录(文件和目录)的名称。更重要的是,这个命令也会重命名目录,但你只想重命名文件。

要以递归方式进行,但仅限于文件,您可以使用find,它以递归方式搜索,并将每个文件传递给rename

find . -type f -execdir rename 'y/a-z/A-Z/' {} \;

此命令仅搜索文件,并对找到该文件的目录(execdir 选项)内的每个文件执行rename。这很重要,因为否则find 会将文件的完整路径(例如:./fold1/fold2/file.txt')传递给rename,而rename 又会尝试将完整路径传递为大写:(./ FOLD1/FOLD2/FILE.TXT) 这将导致错误,因为文件夹 FOLD1FOLD2 不存在。

【讨论】:

  • -execdir 技巧做得很好,谢谢。如果您还想将目录本身大写,可以将-type f 替换为-depth
【解决方案2】:

使用 bash,这很容易:

for f in *; do mv "$f" "${f^^}"; done

扩展${f^^} 将文件名转换为大写。

在另一个 shell 中,使用 tr:

for f in *; do mv "$f" "$(echo "$f" | tr '[:lower:]' '[:upper:]')"; done

【讨论】:

    【解决方案3】:

    我会建议这样的事情:

    ls|sed 's/\(.*\)/mv "\1" "\U\1"/' | sh
    

    我喜欢以这种方式使用 sed,因为在将输出传递到 sh 之前很容易检查输出(在第一步中删除 |sh

    【讨论】:

      【解决方案4】:

      使用 perl

      perl -e 'for (glob "*.txt" ){ rename $_,uc($_)}'
      

      glob "*" 创建当前目录中所有 .txt 文件的列表。 rename 将每个值替换为 uc(大写)值。

      【讨论】:

        猜你喜欢
        • 2013-12-13
        • 2011-05-15
        • 1970-01-01
        • 1970-01-01
        • 2023-03-04
        • 2015-02-28
        • 1970-01-01
        • 1970-01-01
        • 2010-09-14
        相关资源
        最近更新 更多