假设我正在尝试将文件从“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'
但无论我尝试使用什么变体,它只是背诵使用(大概告诉我语法有问题),我无法弄清楚原因。
有什么想法吗?
答案 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
“选项结束”。在文件名之前添加额外的--
可以解决问题。