我在linux机器上有一个文件夹(假设它的名字是../TEMPO),在A,B,C..Z里面有很多文件夹。每个文件夹都有另外3个级别的文件夹。一些较深的文件夹的名称为小写,例如:
A/F/m/O
Z/t/q/S在第四层有一些文件,我想保留与现在相同的名称。
如何在不更改特定文件夹(../TEMPO)中存在的文件名的情况下,仅将文件夹名称递归地重命名为大写?
发布于 2012-03-31 00:10:10
验证此命令的输出
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发布于 2012-03-30 23:54:50
这可能对你有用:
for dir in `find ./TEMPO -type d -regex '.*[a-z].*' -print` ; do
udir=`echo $dir | tr [a-z] [A-Z]`
mv $dir $udir
done发布于 2012-03-31 00:22:55
您必须一次执行一个目录级别的更改,因为底层rename系统调用一次只能进行一次更改。
可以找到的工具是Perl附带的rename实用程序;我在web上找不到它的文档,或者我会链接到它。如果在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 $_' ?/?/?/?如果可能存在任意的嵌套,那么您必须更聪明一些。
https://stackoverflow.com/questions/9946306
复制相似问题