2012-03-30 47 views
2

我在linux機器上有一個文件夾(可以說它的名字是../TEMPO),其中有許多文件夾位於[A,B,C..Z]內。 每個文件夾有3個級別的文件夾。一些更深層次的文件夾都是小寫的名字,例如:Linux - 將所有文件夾重命名爲目標的較高位置

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

在4級有,我想保持具有相同的名稱,因爲它是現在的文件。

如何在不更改特定文件夾(../TEMPO)中存在的文件名稱的情況下將文件夾名稱重新命名爲大寫?

+0

你標記了這個Linux,而不是Windows,所以我冒昧地把你的斜槓做得正確。 – zwol 2012-03-30 16:12:19

回答

3

驗證此命令

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 
+0

艾米特,它像魔術一樣工作,非常感謝你! – user1199838 2012-03-30 16:22:27

2

這可能會爲你工作:

for dir in `find ./TEMPO -type d -regex '.*[a-z].*' -print` ; do 
    udir=`echo $dir | tr [a-z] [A-Z]` 
    mv $dir $udir 
done 
+0

我認爲這將嘗試在一個'mv'操作中進行多項更改,這將不起作用。 – zwol 2012-03-30 16:14:37

+0

哦,你是對的......我會重寫它。 – 2012-03-30 16:15:16

+3

用bash,你可以寫'udir = $ {dir ^^}'而不必調用echo和tr – 2012-03-30 16:25:53

2

您必須一次完成一個目錄級別,因爲底層rename系統呼叫一次只能進行一次更改。

要達到的工具是Perl自帶的rename實用程序;我無法在網上找到它的文檔,或者我會鏈接到它。如果在shell提示下鍵入man rename帶來了這樣的事情:

NAME 
     rename - renames multiple files 

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

那麼你有正確的事情。不幸的是,至少有一個其他工具具有相同的名稱,這對於這項工作來說或多或少是無用的,並且告訴你擁有的唯一方法就是嘗試它。

既然你知道你有一個字符名稱4層目錄,你可以枚舉該目錄的水平,像這樣:

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 $_' ?/?/?/? 

如果有可能是任意嵌套,你就必須要聰明。

0

如果你有prename,這是perl一部分,你可以做到這一點很容易:

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

您可能想通過-nprename第一,以驗證它會做正確的事情。