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$1and$2视为相同的值,但是当我在另一行打印这些变量时,它表明它们是不同的。

4

4 回答 4

3

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

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

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

于 2013-06-20T07:00:15.143 回答
2

您还可以使用参数扩展来替换目录中所有文件的前缀

for file in "$1"*;
do
  mv ${file} ${file/#$1/$2}
done
于 2013-06-20T07:14:46.823 回答
0

当您不使用双引号时,变量不会扩展。

我宁愿用这个

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

在哪里

${file:${#2}

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

于 2013-06-20T07:00:22.100 回答
0

改用双引号:

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

并在 Bash 中学习引用和转义。

于 2013-06-20T06:55:15.040 回答