3

4000 個のファイルがあるとします。

output1
output2
output3
output4
output5
output6
output7
output8 
.....
output3999
output4000

接頭辞が同じで接尾辞が異なる2つの数値的に連続したファイルごとに変更するにはどうすればよいですか? この例では、ファイル名を次のように変更します。

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

これはうまくいくかもしれません(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')
于 2012-11-06T00:15:39.400 に答える
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

ノート:

  • ここでは二重引用符は必要ありませんが、二重引用符がないと、スタック オーバーフローの構文ハイライターが非常に混乱します。(特に、#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}.
于 2012-11-05T23:06:51.510 に答える
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

出力に満足したら、 で変更echomvます。

ループに関する参照は、シェルの man にあります。

于 2012-11-06T07:39:32.533 に答える
1

バッシュで:

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

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 に答える