Linux – 将所有文件夹重命名为目标中较高的文件夹

我在linux机器上有一个文件夹(可以说它的名字是../TEMPO ),里面有许多文件夹[A,B,C..Z]。 每个文件夹有三个级别的文件夹。 某些较深的文件夹名称为小写,例如:

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

在第四级有一些文件,我想保持与现在一样的名字。

我怎样才能重新命名只是文件夹名称大写recursion,而不改变文件名称存在于一个特定的文件夹( ../TEMPO )?

验证此命令的输出

 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 

这可能适合你:

 for dir in `find ./TEMPO -type d -regex '.*[az].*' -print` ; do udir=`echo $dir | tr [az] [AZ]` mv $dir $udir done 

您必须一次执行一个目录级别的操作,因为底层rename系统调用一次只能进行一次更改。

要达到的工具是Perl自带的rename实用程序; 我无法在网上找到它的文档,或者我会链接到它。 如果在shell提示符下输入man rename ,会出现如下所示:

 NAME rename - renames multiple files SYNOPSIS rename [ -v ] [ -n ] [ -f ] perlexpr [ files ] 

那么你有正确的事情。 不幸的是,至少有一个同名的公用事业单位对这项工作或多或少没有任何用处,唯一能告诉你的是哪一个公用事业单位。

既然你知道你有四个目录级别和一个字符的名字,你可以枚举目录级别,如下所示:

 rename 'y/az/AZ/ if -d $_' ? rename 'y/az/AZ/ if -d $_' ?/? rename 'y/az/AZ/ if -d $_' ?/?/? rename 'y/az/AZ/ if -d $_' ?/?/?/? 

如果可以任意嵌套,你必须更聪明。

如果你有prename ,这是perl一部分,你可以很容易地做到这一点:

 find ../TEMPO -depth -type d | xargs prename 's%/([^/]+)$%/\U$1%' 

您可能prename传递-nprename ,以验证它将做正确的事情。