web-dev-qa-db-ja.com

ファイルのセットを移動して名前を変更するmvコマンド

Mvコマンドを使用して、一連のファイルを1つのフォルダーから別のフォルダーに移動します。

   mv <SRC_PATH>/ABC_$t1.dat <DEST_PATH>/ABC_$t1_$$.dat

上記のコードを一連のファイルに使用しています。唯一の違いは、変数$ t1の値であるファイルの名前です。例えば:

  while loop required times
  do    
    t1=<GetValueOfT1 >
    mv <SRC_PATH>/ABC_$t1.dat <DEST_PATH>/ABC_$t1_$$.dat
  done 

上記のコードでは、t1の値は123,234,345になります。

したがって、ソースディレクトリにABC_123.dat、ABC_234.dat、ABC_345.datがある場合、宛先ディレクトリにはABC_123_1808.dat、ABC_234_1808.dat、ABC_345_1808.datがあり、1808はpidです。

しかし結局のところ、移動先のパスは最後のファイルのみを保持しています。宛先名から「$$」を削除した場合、問題はありません。例えば:

  mv <SRC_PATH>/ABC_$t1.dat <DEST_PATH>/ABC_$t1.dat

私は何を間違っていますか?

1
fuzzy

コマンドが存在する そのような大量の名前変更。

個人的に、私はmmvを使用します:

mmv <SRC_PATH>/"ABC_*.dat" <DEST_PATH>/"ABC_#1_$$.dat"
2
xhienne

コンマ区切りの値のセットを含む変数t1があるとします。

t1=$(GetValueOfT1)    # For example t1='123,456,789'

このようなループでこれらのそれぞれを順番に適用できます

OIFS="$IFS" IFS=,
for v in $t1
do
    echo "Processing with v=$v:" >&2
    mv "$SRC_PATH/ABC_${v}.dat" "$DEST_PATH/ABC_${v}_$$.dat"
done
IFS="$OIFS"

シェルで値をコンマ文字で分割する必要があるため、最初の$t1は引用符で囲まないでください。 (これは、シェル変数$IFSによって制御されます。これを保存して、ループの最後で復元できるようにします。)残りの変数はすべて、空白やコンマでの予期しないWord分割から保護するために引用符で囲む必要があります。など。最後に、$v${v}として提示する必要があります。そうしないと、シェルは直後に続く_文字を変数名の一部として含みますが、$v_はそうではありません私たちが欲しいもの。

実際に実行する前に、mvの前にecho(つまりecho mv ...)を付けることをお勧めします。これにより、変更が行われる前に出力を確認できます。

0
roaima