bash:for循环中的mv只是背诵使用

时间:2012-11-28 05:42:02

标签: bash

假设我正在尝试将文件从“aa - bb.pdf”移动到“bb - aa.pdf”。

这样做的显而易见的方法是:

for f in *;
do 
mv $f $(echo "$f" | sed -E 's/(.\*) -- (.\*)(\..\*)/\2 -- \1\3/'); 
done

我需要在一些参数周围添加单引号,因为各种参数中的空格无法正确拾取,所以它实际上看起来应该更像这样:

for f in *; 
do 
    $(echo mv "'"$f"'" "'"$(echo "$f" | sed -E 's/(.\*) -- (.\*)(\..\*)/\2 -- \1\3/')"'");
done

但无论如何,我得到的只是mv的标准用法重演: 用法:mv [-f | -i | -n] [-v] source target

当我将其输出到屏幕时,它看起来很棒:

mv 'aa -- bb.pdf' 'bb -- aa.pdf'

但无论我尝试使用什么变体,它只是背诵使用(大概告诉我语法有问题),我无法弄清楚原因。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

这是一个bash实现:

re="(.+) -- (.+)([.].+)"
for f in *; do
    if [[ $f =~ $re ]]; then 
        newf="${BASH_REMATCH[2]} -- ${BASH_REMATCH[1]}${BASH_REMATCH[3]}"
        mv -- "$f" "$newf"
    fi
done

您的错误原因可能是--告诉mv“选项结束”。在文件名之前添加额外的--可以解决问题。