脚本不替换文件名的前缀

时间:2013-06-20 06:51:36

标签: linux bash shell

我试图用另一个前缀(重命名)替换目录中所有文件的前缀。

这是我的剧本

# 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视为相同的值,但当我在另一行上打印这些变量时,它会显示它们不同。

4 个答案:

答案 0 :(得分:3)

正如Roman Newaza所说,您可以使用"代替'告诉Bash您希望扩展变量。但是,在您的情况下,写起来最安全:

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

因此文件名或脚本参数中的奇怪字符不会导致任何问题。

答案 1 :(得分:2)

您还可以使用parameter expansion替换目录中所有文件的前缀

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

答案 2 :(得分:0)

改为使用双引号:

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

在Bash中学习Quotes and escaping

答案 3 :(得分:0)

如果不使用双引号,变量将不会扩展。

我宁愿使用这个

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

,其中

${file:${#2}

表示子字符串,从参数2的长度到结尾