关于shell:Linux:如何将目录中的所有文件重命名为大写?

Linux: how to rename all files in a directory to uppercase?

本问题已经有最佳答案,请猛点这里访问。

包括分机。例如file.txt-->file.txt

如果有人能指点我的方向,我会感激的:)

这里只是一些随机文本,因为字符计数太低,无法进行stackoverflow…


最初的解决方案是:

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

它获取当前目录中的每个文件/目录,并按其相应的大写版本更改范围A-Z中的每个字符。

rename的问题是没有选择进入目录内部以递归方式应用重命名,并且*字符扩展到当前目录(文件和目录)的名称。更重要的是,这个命令还将重命名目录,但您只想重命名文件。

要递归执行,但只在文件上执行,可以使用find,它以递归方式搜索,并将每个文件传递给rename

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

该命令只搜索文件,并对找到该文件的目录(execdir选项)中的每个文件执行rename。这一点很重要,因为否则find会将文件的完整路径(例如:/fold1/fold2/file.txt)传递给rename,而rename反过来会尝试将完整路径(即,/fold1/fold2/file.txt)传递到大写,这将导致错误,因为文件夹FOLD1FOLD2不存在。


使用bash很容易:

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

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

在另一个shell中,使用tr

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


我建议这样做:

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

我喜欢这样使用SED,因为在将其导入sh之前很容易检查输出(在第一步中删除|sh)。


使用Perl

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

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