假设我有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
有什么建议吗?关于“循环”的进一步在线参考被高度赞赏。谢谢。
答案 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
注意:
#
开始发表评论。)嘿,无论如何,将参数扩展包装在双引号中总是好的做法。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