1

假设我正在尝试将文件从“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'

但无论我尝试什么变体,它只是背诵用法(大概告诉我我的语法有问题),我不知道为什么。

有任何想法吗?

4

1 回答 1

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选项结束”。--在文件名之前添加一个附加项应该可以解决问题。

于 2012-11-28T05:47:46.043 回答