我正在我的mac上运行一个shell脚本,我得到一个“没有这样的文件或目录。
输入是:replacement_name和工作目录。
输出是:将目录中的所有文件从$file
更改为$newfilename
#!/bin/sh
echo "-------------------------------------------------"
echo "Arguments:"
echo "Old File String: $1"
echo "New File Name Head: $2"
echo "Directory to Change: $3"
echo "-------------------------------------------------"
oldname="$1"
newname="$2"
abspath="$3"
echo "Updating all files in '$abspath' to $newname.{extension}"
for file in $(ls $abspath);
do
echo $file
echo $file | sed -e "s/$oldname/$newname/g"
newfilename=$("echo $file| sed -e \"s/$oldname/$newname/g\"")
echo "NEW FILE: $newfilename"
mv $abspath/$file $abspath/$newfilename
done
似乎它不喜欢将我的1-liner的结果分配给变量。
old_filename_string_template.dart
test_template.dart
./bulk_rename.sh: line 16: echo old_filename_string.dart| sed -e "s/old_filename_string/test/g": No such file or directory
NEW FILE:
测试信息:
mkdir /_temp_folder
touch old_filename_string_template.a old_filename_string_template.b old_filename_string_template.c old_filename_string1_template.a old_filename_string1_template.b old_filename_string1_template.c old_filename_string3_template.a old_filename_string3_template.b old_filename_string3_template.c
./convert.sh old_filename_string helloworld /_temp_folder
答案 0 :(得分:2)
这里的双引号使shell查找一个命令,其名称(文件名,别名或函数名)是引号之间的整个字符串。显然,不存在这样的命令。
> newfilename=$("echo $file| sed -e \"s/old_filename_string/$1/g\"")
删除括号内的双引号和反斜杠之前的反斜杠将修复此特定错误。
构造$(command sequence)
被称为命令替换; shell有效地将此字符串替换为通过评估子shell中的command sequence
获得的标准输出。
您脚本的大部分内容都太多引用太多;所以你真的不清楚为什么你在这里特别添加它们。 http://shellcheck.net/是一项有用的服务,可以指出几十个更微不足道的错误。简而言之,包含文件名的任何内容都应该在双引号之间。
答案 1 :(得分:0)
尝试将双引号放在反引号/加号之外(不是INSIDE反引号/替换,如$("...")
)
newfilename="$(....)"
顺便说一下,请考虑使用已经重新命名这个批量文件的包perl rename,使用更容易使用的Perl
正则表达式样式。您可以在(Mac)发行版中使用此perl rename
命令。请参阅intro pages。