批量重命名文件不适合我

时间:2018-01-18 16:01:06

标签: bash shell sed

我正在我的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

2 个答案:

答案 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