我试图用另一个前缀(重命名)替换目录中所有文件的前缀。
这是我的剧本
# 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
视为相同的值,但当我在另一行上打印这些变量时,它会显示它们不同。
答案 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)
答案 3 :(得分:0)
如果不使用双引号,变量将不会扩展。
我宁愿使用这个
#!/bin/bash
for file in $1*;
do
mv "$file" "$1${file:${#2}}"
done
,其中
${file:${#2}
表示子字符串,从参数2的长度到结尾