包括扩展名。例如file.txt - > FILE.TXT
如果有人能指出我的大方向,那么我将不胜感激:)
这里只是一些随机文本,因为Stackoverflow的字符数太低了......
答案 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
(大写)值。