【发布时间】:2015-07-29 23:22:36
【问题描述】:
包括扩展。例如 file.txt --> FILE.TXT
如果有人能指出我的大致方向,我将不胜感激:)
这里只是一些随机文本,因为 Stackoverflow 的字符数太少...
【问题讨论】:
-
你使用的是哪个外壳?
标签: linux shell awk sed rename
包括扩展。例如 file.txt --> FILE.TXT
如果有人能指出我的大致方向,我将不胜感激:)
这里只是一些随机文本,因为 Stackoverflow 的字符数太少...
【问题讨论】:
标签: linux shell awk sed rename
最初的解决方案是:
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) 这将导致错误,因为文件夹 FOLD1 和 FOLD2 不存在。
【讨论】:
-execdir 技巧做得很好,谢谢。如果您还想将目录本身大写,可以将-type f 替换为-depth。
使用 bash,这很容易:
for f in *; do mv "$f" "${f^^}"; done
扩展${f^^} 将文件名转换为大写。
在另一个 shell 中,使用 tr:
for f in *; do mv "$f" "$(echo "$f" | tr '[:lower:]' '[:upper:]')"; done
【讨论】:
我会建议这样的事情:
ls|sed 's/\(.*\)/mv "\1" "\U\1"/' | sh
我喜欢以这种方式使用 sed,因为在将输出传递到 sh 之前很容易检查输出(在第一步中删除 |sh)
【讨论】:
使用 perl
perl -e 'for (glob "*.txt" ){ rename $_,uc($_)}'
glob "*" 创建当前目录中所有 .txt 文件的列表。
rename 将每个值替换为 uc(大写)值。
【讨论】: