我在linux機器上有一個文件夾(可以說它的名字是../TEMPO
),其中有許多文件夾位於[A,B,C..Z]內。 每個文件夾有3個級別的文件夾。一些更深層次的文件夾都是小寫的名字,例如:Linux - 將所有文件夾重命名爲目標的較高位置
A/F/m/O
Z/t/q/S
在4級有,我想保持具有相同的名稱,因爲它是現在的文件。
如何在不更改特定文件夾(../TEMPO
)中存在的文件名稱的情況下將文件夾名稱重新命名爲大寫?
我在linux機器上有一個文件夾(可以說它的名字是../TEMPO
),其中有許多文件夾位於[A,B,C..Z]內。 每個文件夾有3個級別的文件夾。一些更深層次的文件夾都是小寫的名字,例如:Linux - 將所有文件夾重命名爲目標的較高位置
A/F/m/O
Z/t/q/S
在4級有,我想保持具有相同的名稱,因爲它是現在的文件。
如何在不更改特定文件夾(../TEMPO
)中存在的文件名稱的情況下將文件夾名稱重新命名爲大寫?
驗證此命令
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
艾米特,它像魔術一樣工作,非常感謝你! – user1199838 2012-03-30 16:22:27
這可能會爲你工作:
for dir in `find ./TEMPO -type d -regex '.*[a-z].*' -print` ; do
udir=`echo $dir | tr [a-z] [A-Z]`
mv $dir $udir
done
我認爲這將嘗試在一個'mv'操作中進行多項更改,這將不起作用。 – zwol 2012-03-30 16:14:37
哦,你是對的......我會重寫它。 – 2012-03-30 16:15:16
用bash,你可以寫'udir = $ {dir ^^}'而不必調用echo和tr – 2012-03-30 16:25:53
您必須一次完成一個目錄級別,因爲底層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 $_' ?/?/?/?
如果有可能是任意嵌套,你就必須要聰明。
如果你有prename
,這是perl
一部分,你可以做到這一點很容易:
find ../TEMPO -depth -type d | xargs prename 's%/([^/]+)$%/\U$1%'
您可能想通過-n
到prename
第一,以驗證它會做正確的事情。
你標記了這個Linux,而不是Windows,所以我冒昧地把你的斜槓做得正確。 – zwol 2012-03-30 16:12:19