2017-02-28 41 views
0

很新的腳本進入了另一個前綴前綴......KSH重命名多個文件與用戶輸入的用戶

可以說我有在當前目錄中的多個前綴的多個文件。我需要根據用戶輸入重新命名它們。 假設我有aaa_file.dat和bbb_file.dat aaa_log.dat ccc.txt等等。

腳本會要求輸入「舊前綴」並輸入「新前綴」並搜索帶有「舊」前綴的文件,並將其用「新」前綴變爲名稱。

print "enter old prefix" ; 

read old ; 

print "enter new prefix" ; 

read new ; 

找到並重命名的部分是我卡住..

for $old in * ; 
do mv $old_* $new_* ; 
done 

如果我作爲用戶AAA和ZZZ我的文件輸入,我的結果應該是: aaa_file.dat和aaa_log.dat現在命名爲zzz_file.dat zzz_log.dat

+0

您需要花一點時間閱讀'man mv'並製作小測試用例。另外,通過http://shellcheck.net運行你的代碼。祝你好運。 – shellter

回答

0

你有一些失誤

for $old in * ; 
do 
    mv $old_* $new_* ; 
done 

當你使用for循環時,一個值將被分配給循環變量。因此請將$放入for $old in *
您已經爲變量old分配了一個值,您不想用新值覆蓋它。使用一個新的變量,如for file in *(或for file in ${old}*)。 變量名稱中可能含有下劃線。 $old_*${old}_*不一樣。習慣於在所有情況下使用這些大括號,除了一個字符變量時,後跟一個空格或引號。
當你寫${new}_*時,你希望有一些神奇。該變量將被擴展爲它的值(如zzz),shell搜索以zzz_(未找到)開頭的文件,並將嘗試(當您編寫mv ${old}_* ${new}_*時)將名稱以aaa_開頭的所有文件移動到名爲zzz_*
因此,使用類似於sed的文件構建一個新文件名:

新文件名必須由舊文件名構建。

for file in ${old}_*; do 
    newfile=$(echo "${file}"| sed "s/^${old}_/${new}_/") 
    # Remove the word echo when the command shows the mv commands you like 
    echo mv "${file}" "${newfile}" 
done