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

时间:2012-11-05 22:51:36

标签: linux sed awk

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

有什么建议吗?关于“循环”的进一步在线参考被高度赞赏。谢谢。

6 个答案:

答案 0 :(得分:3)

你可以写:

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

注意:

  • 这里不需要双引号,但没有它们,Stack Overflow语法高亮显示会变得非常困惑。 (特别是,它认为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}

答案 1 :(得分:2)

这可能适合你(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')

答案 2 :(得分:1)

使用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

答案 3 :(得分:1)

你可以这样做:

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

如果您对输出感到满意,请按echo更改mv

关于循环的引用可以在shell的man中找到。

答案 4 :(得分:1)

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

答案 5 :(得分:1)

使用GNU Parallel,您可以执行以下操作:

parallel mv output{#} Type{1}_{2}.abc ::: {0001..2000} ::: A B