shell脚本重命名

shell脚本重命名

实现一个命令,即变量的内容。

我正在尝试创建一个 bash 重命名程序,可以重命名给定目录中的所有文件。我有以下程序:

for PATHFILE in tracks/*
do
   path="$(dirname "$PATHFILE")"
   file="$(basename "$PATHFILE")"

   program='mv';

   if [[ "$file" =~ ([0-9]*)\s*(.*) ]]
   then

       from=${path}/${file}
       to=${path}/${BASH_REMATCH[1]};

       command_string="$program '$from' '$to'";

       #here the command_string contains the command i want to execute.
       $(command_string);
       #causes error:
       # mv: target ''\''tracks/01'\''' is not a directory.

       break;
    fi

done

如果我自己直接运行该命令,那么它运行没有问题。我也不太明白为什么系统在字符串周围添加这些逗号。

如果我将变量回显到屏幕上,那么我可以复制它,运行它,它运行时不会出现错误。但如果我尝试在代码中运行它,我就会不断收到此错误。

我该如何让它发挥作用?

答案1

首先,$(command_string)会给出错误“bash:command_string:找不到命令”作为命令替换。命令替换将运行括号内的命令,并用该命令的输出替换整个内容。

其次,即使您只是用来$command_string执行命令,您仍然可以在文件名中添加单引号。文件名中没有单引号。

一般来说,避免将命令放入变量中即可。看 ”我们如何运行存储在变量中的命令?”。

相反,也许是这样的:

#!/bin/bash

for pathname in tracks/*; do
    if [[ "$pathname" =~ ([0-9]+)[[:blank:]]* ]]; then
        newpathname="${pathname%/*}/${BASH_REMATCH[1]}"
        printf 'Would move "%s" to "%s"\n' "$pathname" "$newpathname"
        # mv -i "$pathname" "$newpathname"
        break
    fi
done

这个循环做了(我认为)你想要做的事情。为了安全起见,我已经注释掉了实际重命名文件的部分。

相关内容