[英]bash: mv within for loop just recites usage
假设我正在尝试将文件从“ 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 [-f | -i | -n] [-v] source target
mv [-f | -i | -n] [-v] source target
等
当我将其输出到屏幕上时,看起来很棒:
mv 'aa -- bb.pdf' 'bb -- aa.pdf'
但是,无论我尝试哪种变化,它都只会背诵用法(大概是在告诉我我的语法有问题),而我不知道为什么。
有任何想法吗?
这是一个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
“选项结束”。 在文件名之前添加其他--
应该可以解决此问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.