3

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

有什么建议么?高度赞赏有关“循环”的更多在线参考。谢谢你。

4

6 回答 6

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 语法高亮器会变得非常混乱。(特别是,它认为以#十为底的算术常数开始注释。)嘿,无论如何,将参数扩展用双引号括起来总是很好的做法。
  • 如果你愿意,你可以通过使用外部程序来简化第一行seq,而$(seq -w 1 2000)不是000{1..9} 00{10..99} 0{100..999} {1000..2000}. 就此而言,如果你有 Bash 4.x,你可以只写{0001..2000}.
于 2012-11-05T23:06:51.510 回答
3

这可能对您有用(GNU sed 和并行):

parallel --xapply mv output{1} Type{2}.abc ::: $(seq 4000) ::: $(seq -f '%04g_A' 2000|sed 'h;s/A/B/;H;g')
于 2012-11-06T00:15:39.400 回答
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
于 2012-11-06T02:48:44.093 回答
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 中找到关于循环的参考。

于 2012-11-06T07:39:32.533 回答
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
于 2012-11-08T21:10:20.673 回答
1

使用 GNU Parallel,您可以这样做:

parallel mv output{#} Type{1}_{2}.abc ::: {0001..2000} ::: A B
于 2019-09-11T19:11:21.320 回答