Linux - 将目标文件夹中的所有文件夹重命名为大写

3

我可以帮助您进行翻译。需要翻译的内容涉及IT技术,具体是关于Linux机器上一个名为../TEMPO的文件夹,里面有很多文件夹[A,B,C..Z],每个文件夹下又有三层子文件夹。其中一些深层次的文件夹名称是小写的,例如:

A/F/m/O
Z/t/q/S

在第四级目录中,有些文件我希望保持现有的文件名不变。
如何递归地将文件夹名称改为大写,而不更改特定文件夹 (../TEMPO) 中已存在的文件名?

你给这个标签打了Linux,而不是Windows,所以我代表您将斜杠进行了正确的更改。 - zwol
4个回答

4

请验证此命令的输出结果

find path/to/dir -type d | awk -F"/" '$NF != toupper($NF) {l = n = $0; sub($NF "$", toupper($NF), n); print "mv " l " " n;}' | tac

如果一切看起来正常,就把结果通过管道传递到sh中执行。

find path/to/dir -type d | awk -F"/" '$NF != toupper($NF) {l = n = $0; sub($NF "$", toupper($NF), n); print "mv " l " " n;}' | tac | sh

2
这可能适用于您:
for dir in `find ./TEMPO -type d -regex '.*[a-z].*' -print` ; do
    udir=`echo $dir | tr [a-z] [A-Z]`
    mv $dir $udir
done

我认为这会尝试在一个“mv”操作中进行多个更改,这是行不通的。 - zwol
3
使用bash,你可以写成 udir=${dir^^},而不必调用echo和tr函数。 - glenn jackman

2
你需要一次一个目录级别地执行此操作,因为底层的rename系统调用只能一次进行一项更改。
解决此问题的工具是Perl附带的rename实用程序;我找不到它的文档,否则我会链接它。如果在shell提示符下键入man rename,会出现类似于以下内容的东西:
NAME
       rename - renames multiple files

SYNOPSIS
       rename [ -v ] [ -n ] [ -f ] perlexpr [ files ]

如果你找到了正确的工具,那就太好了。不幸的是,至少还有一个同名的实用工具却与此毫无关系,唯一的区别在于试用它。

既然你知道有四个只含一个字符名称的目录级别,你可以按照以下方式枚举目录级别:

rename 'y/a-z/A-Z/ if -d $_' ?
rename 'y/a-z/A-Z/ if -d $_' ?/?
rename 'y/a-z/A-Z/ if -d $_' ?/?/?
rename 'y/a-z/A-Z/ if -d $_' ?/?/?/?

如果允许任意嵌套,那么你需要更加聪明才行。

0
如果您有perl中的prename,那么您可以非常容易地完成这个任务:
find ../TEMPO -depth -type d | xargs prename 's%/([^/]+)$%/\U$1%'

你可能需要先传递-nprename,以验证它会执行正确的操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接