假设我有4000个文件:
output1 output2 output3 output4 output5 output6 output7 output8 ..... output3999 output4000
我怎样才能改变每个两个相同的前缀,但不同的后缀数字连续的文件? 在这个例子中,我想把文件名改成:
output1 -> Type0001_A.abc output2 -> Type0001_B.abc output3 -> Type0002_A.abc output4 -> Type0002_B.abc output5 -> Type0003_A.abc output6 -> Type0003_B.abc output7 -> Type0004_A.abc output8 -> Type0004_B.abc ..... ..... output3999 -> Type2000_A.abc output4000 -> Type2000_B.abc
我已经做了一个简单的循环,可以解决前缀,但不知道如何后缀数字和字母可以完成。
for i in `find . -name "output*"` do l=`echo $i |sed 's/output/Type/'` '$i > $l` done
有什么build议么? 有关“循环”的进一步在线参考受到高度赞赏。 谢谢。
你可以写:
for suffix in 000{1..9} 00{10..99} 0{100..999} {1000..2000} ; do mv "output$((10#$suffix * 2 - 1))" "Type${suffix}_A.abc" mv "output$((10#$suffix * 2))" "Type${suffix}_B.abc" done
笔记:
#
开始注释)。嘿,将参数扩展包装在双引号中总是一个很好的习惯。 seq
来简化第一行,并写$(seq -w 1 2000)
而不是000{1..9} 00{10..99} 0{100..999} {1000..2000}
。 对于这个问题,如果你有Bash 4.x,你可以写{0001..2000}
。 这可能适用于你(GNU sed&parallel):
parallel --xapply mv output{1} Type{2}.abc ::: $(seq 4000) ::: $(seq -f '%04g_A' 2000|sed 'h;s/A/B/;H;g')
与bash:
i=0 ab=( [0]=A [1]=B ) for f in output*; do n=${f#output} printf -v newname "Type%04d_%c.abc\n" $(( (n+1)/2 )) ${ab[i]} i=$(( (i+1)%2 )) mv "$f" "$newname" done
你可以这样做:
seq 1 2000 | while read num; do echo "output$((num*2-1))" "Type$(printf "%04d" $num)_A.abc" echo "output$((num*2+0))" "Type$(printf "%04d" $num)_B.abc" done
如果你对输出满意,用mv
改变echo
。
循环引用可以在你的shell中找到。
awk的另一个解决方案:
awk '{if(NR%2){printf "%s%s%04d%s\n",$0, " -> Type",(NR+1)/2,"_A.abc"} else {printf "%s%s%04d%s\n",$0, " -> Type",NR/2,"_B.abc" }}' file