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

时间:2015-05-18 12:41:08

标签: linux shell awk sed rename

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

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

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

4 个答案:

答案 0 :(得分:3)

使用bash,这很简单:

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

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

在另一个shell中,使用tr

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

答案 1 :(得分:3)

最初的解决方案是:

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

它接受当前目录中的每个文件/目录,并通过相应的大写版本更改a-z范围内的每个字符。

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

要递归执行此操作,但仅限于文件,您可以使用递归搜索的find,并将每个文件传递给rename

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

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

答案 2 :(得分:1)

我会建议这样的事情:

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

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

答案 3 :(得分:0)

使用perl

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

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