Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux-将目标中的所有文件夹重命名为upper_Linux_Bash_Recursion_Directory_Rename - Fatal编程技术网

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

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

我在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
    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