1

フォルダーを 1 から 05 に移動して番号を割り当てようとしています。

例:

test-01 => test-221
test-02 => test-222
test-03 => test-223
test-04 => test-224
test-05 => test-225

私はこれを試しました;

for num in $(seq -w $2 $3); {
  mv -v "test-$num" "test-$1$num"
}

このように使用します。

./script.sh 2 21 25

しかし、私は出力を得ています。

test-21 => test-221
test-22 => test-222
test-23 => test-223
test-24 => test-224
test-25 => test-225

これはもちろん間違っています。例を参照してください:-)

私もこの方法で試しました。

for a in {1..5}; {
  for b in {21..25}; {
    echo "$a => $b"
  } #b
} #a

しかし、このような出力が繰り返されます。

1 => 21
1 => 22
1 => 23
1 => 24
1 => 25
2 => 21
2 => 22
2 => 23
2 => 24
2 => 25
3 => 21
3 => 22
3 => 23
3 => 24
3 => 25
4 => 21
4 => 22
4 => 23
4 => 24
4 => 25
5 => 21
5 => 22
5 => 23
5 => 24
5 => 25
4

6 に答える 6

2

使ってみてawk

#!/bin/bash

awk -v fa=$1 -v fb=$2 -v ta=$3  'BEGIN {  for(i=fa;i<=fb;i++) printf "test-%02d => test-%02d\n",i,i+ta  }'

テスト

$bash -f main.sh 1 5 220
test-01 => test-221
test-02 => test-222
test-03 => test-223
test-04 => test-224
test-05 => test-225

OPのリクエストに応じて見栄えの良い複数行のコード

#!/bin/bash

awk -v fa=$1 -v fb=$2 -v ta=$3  'BEGIN {  
  for(i=fa;i<=fb;i++) 
    printf "test-%02d => test-%02d\n",i,i+ta
}'

ファイルを移動するための実際のスクリプト

#!/bin/bash

awk -v fa=$1 -v fb=$2 -v ta=$3  'BEGIN {  
  for(i=fa;i<=fb;i++) {
    cmd = sprintf ("mv -v test-%02d test-%02d",i ,i+ta);
    # print cmd;
    system(cmd);
  }
}'
于 2013-11-10T13:57:03.217 に答える
1

私たちがコメントで行ったすべての面白い議論 (それは本当に面白いスレッドでした) から、私は多かれ少なかれ (おそらくより少ない) あなたが何を望んでいるのかを理解しました. 私が理解したことを言い換えさせてください (これがあなたが正確に要求したものでない場合は、ご容赦ください)。

負でない 3 つの数値引数XYおよびZ(先頭に0's がある可能性があります) を使用するスクリプトが必要であり、次の場所X<Yに出力します。test-M => test-N

  • MXからまでの範囲で、 の文字数がおよびの最大文字数になるように、左側に 's がY埋め込まれます0MXY
  • N=M+Zの文字数が、、およびの最大文字数に0なるように、左に 's が埋め込まれます。例えば、NXYZY+Z

    $ ./script 01 04 00220
    test-01 => test-00221
    test-02 => test-00222
    test-03 => test-00223
    test-04 => test-00224
    
    $ ./script 99 101 0
    test-099 => test-099
    test-100 => test-100
    test-101 => test-101
    
    $ ./script 99 101 00000
    test-099 => test-00099
    test-100 => test-00100
    test-101 => test-00101
    
    $ ./script 00 02 99
    test-00 => test-099
    test-01 => test-100
    test-02 => test-101
    

mvまた、別のコマンドの出力を解析しなくても対応するファイルを取得できるように、bash ソリューションが必要です。

では、掘り下げて興味深いものを見つけていただければ幸いです (注意してください。出力はmv -nv xxx yyyではなくの形式です。これに満足したらtest-x => test-y、 を削除してください)。echo

#!/bin/bash

prepend_source=test-
prepend_target=test-
append_source=
append_target=

shopt -s extglob

die() { printf >&2 "%s\n" "$@"; exit 1; }

is_number() { [[ $1 = +([[:digit:]]) ]]; }

is_in_range() { [[ -z ${1//0/} ]] || [[ ${1/#+(0)} = $((10#$1)) ]]; }

maxlength() {
    local u l=0 retvar=$1
    shift
    for i in "$@"; do
        u=${#i}
        ((u>l)) && ((l=u))
    done
    printf -v "$retvar" "%d" "$l"
}

X=$1
Y=$2
Z=$3

is_number "$X" || die "First argument is not a valid number"
is_number "$Y" || die "Second argument is not a valid number"
is_number "$Z" || die "Third argument is not a valid number"

(( 10#$X <= 10#$Y )) || die "Error: first argument is greater than second"

is_in_range "$X" || die "First argument out of range"
is_in_range "$Y" || die "Second argument out of range"
is_in_range "$Z" || die "Third argument out of range"
(( 10#$Y + 10#$Z >= 0 )) || die "Sum of second and last arguments is out of range"

maxlength "length_s" "$X" "$Y"
maxlength "length_t" "$X" "$Y" "$Z" "$((10#$Y+10#$Z))"

for ((i=10#$X;i<=10#$Y;++i)); do
    printf -v source "%s%.${length_s}d%s" "$prepend_source" "$i" "$append_source"
    printf -v target "%s%.${length_t}d%s" "$prepend_target" "$((10#$Z+$i))" "$append_target"
    # Here we're all done!
    echo mv -nv -- "$source" "$target" || die "Problem in mv" # or another error handle
done

変数prepend_sourceappend_sourceprepend_targetappend_targetスクリプトの先頭に追加したので、必要なものに簡単に置き換えることができます。オプションの解析を追加して、コマンド ラインから設定できるようにすることもできます (私がやると主張しない限り、演習として残しておいてください)。

警告。数値は bash によって直接処理されるため、bash の算術範囲内からそれらを使用する必要があります。これは、64 ビット マシンでは (非常に可能性が高い) [-9223372036854775808,9223372036854775807] です。そのため、その前にできることはたくさんあります。明示的なチェックを追加したので、何かがこの範囲外に出てもスクリプトが壊れることはありません。これが本当に制限である場合は、いつでも代わりにbcorを使用できdcます。bcorのdc実装は、演習として読者に任せます。ちなみに、これは非負の整数でのみ機能します。


あなたのソリューションは、これと同じくらい堅牢で一般的ですか?

于 2013-11-10T14:47:36.210 に答える
0

これが私がこれまでに持っているものです。

for i in $(seq -w $1 $2); {
  echo "test-$i => test-$((i+$3))"
} #for

./script.sh 01 05 220 を実行して得られる出力

test-01 => test-221
test-02 => test-222
test-03 => test-223
test-04 => test-224
test-05 => test-225

私の例と一致しているように見えます:-)

于 2013-11-10T13:43:50.670 に答える