Linux-将目标中的所有文件夹重命名为upper
我在linux机器上得到了一个文件夹(比如它的名字是Linux-将目标中的所有文件夹重命名为upper,linux,bash,recursion,directory,rename,Linux,Bash,Recursion,Directory,Rename,我在linux机器上得到了一个文件夹(比如它的名字是。/TEMPO),里面有很多文件夹[a,B,C..Z]。 每个文件夹有3个以上的文件夹级别。一些更深层次的文件夹使用小写名称,例如: A/F/m/O Z/t/q/S 在第四级中,我希望保留与现在同名的文件 如何在不更改特定文件夹中存在的文件名(。/TEMPO)的情况下,将文件夹名递归重命名为大写?这可能适用于您: for dir in `find ./TEMPO -type d -regex '.*[a-z].*' -print` ; do
。/TEMPO
),里面有很多文件夹[a,B,C..Z]。
每个文件夹有3个以上的文件夹级别。一些更深层次的文件夹使用小写名称,例如:
A/F/m/O
Z/t/q/S
在第四级中,我希望保留与现在同名的文件
如何在不更改特定文件夹中存在的文件名(
。/TEMPO
)的情况下,将文件夹名递归重命名为大写?这可能适用于您:
for dir in `find ./TEMPO -type d -regex '.*[a-z].*' -print` ; do
udir=`echo $dir | tr [a-z] [A-Z]`
mv $dir $udir
done
验证此命令的输出
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
您必须一次执行一个目录级别的操作,因为底层系统调用一次只能进行一次更改 要使用的工具是Perl附带的
重命名
实用程序;我在网上找不到它的文档,或者我会链接到它。如果在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 $_' ?/?/?/?
如果可以进行任意嵌套,那么您必须更加聪明。如果您有
prename
,这是perl
的一部分,那么您可以非常轻松地做到这一点:
find ../TEMPO -depth -type d | xargs prename 's%/([^/]+)$%/\U$1%'
您可能需要首先将
-n
传递到prename
,以验证它是否正确。您标记了此Linux,而不是Windows,因此我冒昧地让您的斜杠走上正确的道路。我认为这将尝试在一个“mv”操作中进行多次更改,但这不起作用。使用bash,您可以编写udir=${dir^}
并且不必调用echo和tr