如何将数字连续文件名更改为相同的前缀,但不同的后缀名?

假设我有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 

笔记:

  • 双引号不需要在这里,但没有他们,堆栈溢出语法荧光笔变得非常困惑。 (特别是,它认为base-ten-arithmetic-constant中的#开始注释)。嘿,将参数扩展包装在双引号中总是一个很好的习惯。
  • 如果你愿意,可以通过使用外部程序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