首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux -将目标中的所有文件夹重命名为upper

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

Stack Overflow用户
提问于 2012-03-30 23:46:53
回答 4查看 2K关注 0票数 3

我在linux机器上有一个文件夹(假设它的名字是../TEMPO),在A,B,C..Z里面有很多文件夹。每个文件夹都有另外3个级别的文件夹。一些较深的文件夹的名称为小写,例如:

代码语言:javascript
复制
A/F/m/O
Z/t/q/S

在第四层有一些文件,我想保留与现在相同的名称。

如何在不更改特定文件夹(../TEMPO)中存在的文件名的情况下,仅将文件夹名称递归地重命名为大写?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-03-31 00:10:10

验证此命令的输出

代码语言:javascript
复制
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来执行结果。

代码语言:javascript
复制
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
票数 4
EN

Stack Overflow用户

发布于 2012-03-30 23:54:50

这可能对你有用:

代码语言:javascript
复制
for dir in `find ./TEMPO -type d -regex '.*[a-z].*' -print` ; do
    udir=`echo $dir | tr [a-z] [A-Z]`
    mv $dir $udir
done
票数 2
EN

Stack Overflow用户

发布于 2012-03-31 00:22:55

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

可以找到的工具是Perl附带的rename实用程序;我在web上找不到它的文档,或者我会链接到它。如果在shell提示符下键入man rename会出现如下内容:

代码语言:javascript
复制
NAME
       rename - renames multiple files

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

那么你就有了正确的选择。不幸的是,至少还有一个同名的其他实用程序对这项工作或多或少是无用的,唯一的方法就是尝试一下。

由于您知道您有四个目录级别,名称只有一个字符,因此您可以只枚举目录级别,如下所示:

代码语言:javascript
复制
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 $_' ?/?/?/?

如果可能存在任意的嵌套,那么您必须更聪明一些。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9946306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档