2013-06-20 89 views
1

我想用另一個前綴(重命名)替換目錄中所有文件的前綴。腳本不替換文件名的前綴

這是我的腳本

# Script to rename the files 
#!/bin/bash 
for file in $1*; 
do 
    mv $file `echo $file | sed -e 's/^$1/$2/'`; 
done 

在與

rename.sh BIT SIT 

執行腳本我收到以下錯誤

mv: `BITfile.h' and `BITFile.h' are the same file 
mv: `BITDefs.cpp' and `BITDefs.cpp' are the same file 
mv: `BITDefs.h' and `BITDefs.h' are the same file 

好像sed是治療$1$2一樣價值,但是當我p在另一行上打印這些變量表明它們不同。

+0

不要忘了接受低於他們是否幫助你:-) –

回答

3

正如Roman Newaza所說,您可以使用"而不是'告訴Bash您希望擴展變量。然而,在你的情況,這將是最安全的寫:

for file in "$1"* ; do 
    mv -- "$file" "$2${file#$1}" 
done 

所以在那個文件名字符怪異,或在你的腳本參數,不會引起任何問題。

+0

感謝,它完美地 –

+0

工作@ rahul.deshmukhpatil的解決方案之一:不客氣! – ruakh

0

使用雙引號來代替:

# ... 
mv "$file" `echo $file | sed -e "s/^$1/$2/"` 
# ... 

而且在猛砸學習Quotes and escaping

0

當您不使用雙引號時,變量將不會展開。

我寧願用這個

#!/bin/bash 
for file in $1*; 
do 
    mv "$file" "$1${file:${#2}}" 
done 

其中

${file:${#2} 

意味着子,從參數2的長度到底

2

您還可以使用parameter expansion更換前綴目錄中所有文件的

for file in "$1"*; 
do 
    mv ${file} ${file/#$1/$2} 
done 
+1

你想用'「$ 1」*'來避免[分詞](http://mywiki.wooledge.org/WordSplitting)。 – l0b0

+0

@ l0b0 true;固定。 – devnull

+3

這個例子很好,但是在文件名空白的情況下,將'mv'的兩個參數加雙引號可能是一個好主意。 – doubleDown