mv comando para mover e renomear conjunto de arquivos

1

Estou usando o comando mv para mover um conjunto de arquivos de uma pasta para outra que envolve a renomeação dos arquivos também.

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

Estou usando o código acima para um conjunto de arquivos. A única diferença está no nome dos arquivos são o valor da variável $ t1. Por exemplo:

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

No código acima t1 terá valor de 123,234,345.

Então, se eu tiver ABC_123.dat, ABC_234.dat, ABC_345.dat no diretório de origem, meu diretório de destino terá ABC_123_1808.dat, ABC_234_1808.dat, ABC_345_1808.dat, dado que 1808 é o pid.

Mas, afinal, o caminho de destino da movimentação contém apenas o último arquivo. Se eu removi o "$$" do nome do destino, não há problema. Por exemplo:

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

O que estou fazendo de errado?

    
por fuzzy 04.01.2017 / 14:43

2 respostas

2

Existem comandos para esse tipo de renomeação em massa.

Pessoalmente, uso mmv :

mmv <SRC_PATH>/"ABC_*.dat" <DEST_PATH>/"ABC_#1_$$.dat"
    
por 04.01.2017 / 23:24
0

Suponha que você tenha uma variável t1 que contenha um conjunto de valores separados por vírgulas:

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

Você pode aplicar cada um deles por vez com um loop como este

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"

O primeiro $t1 não deve ser citado porque precisamos que o shell divida o valor em seus caracteres de vírgula. (Isso é controlado pela variável de shell $IFS , que salvamos para que possamos restaurá-la no final do loop.) As variáveis restantes devem ser todas citadas para protegê-las contra a divisão inesperada de palavras em espaços em branco, vírgulas etc. Finalmente, você tem que apresentar $v as ${v} porque senão o shell incluirá o caractere _ imediatamente como parte do nome da variável, e $v_ não é o que nós queremos.

Eu recomendo que você prefixe o mv com echo (ou seja, echo mv ... ) antes de executar isso para real, para que você possa examinar a saída antes de alterar qualquer coisa.

    
por 04.01.2017 / 16:37