Use a saída curinga como uma variável em um cálculo aritmético

1

Eu tenho arquivos com nomes e caminhos de diretório da seguinte forma:

t10n2/data/file.dat0, t10n2/data/file.dat1, t10n2/data/file.dat2, ...

Desejo alterar os nomes dos arquivos usando uma operação aritmética que envolve as variáveis $1 e $2 em t10n$1 e dat$2 , de forma que os nomes dos arquivos sejam alterados para file.dat$(($1*5 + $2)) .

Em particular, eu acho que o que eu quero saber é como usar a saída de um curinga como ! ou * como uma variável em uma operação aritmética? O resto eu posso fazer.

    
por ap21 05.10.2017 / 17:15

4 respostas

3

com Perl rename :

prename -n 's!t10n(\d+)/data/file.dat\K(\d+)!$1*5+$2!e' t10n*/data/file.dat*

Remova -n quando estiver satisfeito com o resultado.

    
por 05.10.2017 / 17:59
3

Usando o bash:

for file in t10*/data/file.dat*
do
  if [[ $file =~ (t10n([[:digit:]]+)/data/file.dat)([[:digit:]]+) ]]
  then
    echo mv -- "$file" "${BASH_REMATCH[1]}$(( ${BASH_REMATCH[2]} * 5 + ${BASH_REMATCH[3]} ))"
  fi
done

O trabalho pesado é feito pelo operador =~ expressão regular na operação [[ test. Existem três expressões com parênteses para capturar os elementos nos quais estamos interessados:

  1. a maior parte do nome do arquivo, exceto para o dat number
  2. o t10n number
  3. o dat number

Se o arquivo corresponder ao padrão, os valores resultantes estarão no array BASH_REMATCH, então os usaremos para calcular o novo nome do arquivo.

Remova o echo se os resultados parecerem corretos.

Exemplo de entrada:

mkdir -p t10n2/data t10n3/data
touch t10n2/data/{file.dat0,file.dat1,file.dat2}
touch t10n3/data/{file.dat0,file.dat1,file.dat2}

Exemplo de saída:

mv -- t10n2/data/file.dat0 t10n2/data/file.dat10
mv -- t10n2/data/file.dat1 t10n2/data/file.dat11
mv -- t10n2/data/file.dat2 t10n2/data/file.dat12
mv -- t10n3/data/file.dat0 t10n3/data/file.dat15
mv -- t10n3/data/file.dat1 t10n3/data/file.dat16
mv -- t10n3/data/file.dat2 t10n3/data/file.dat17
    
por 05.10.2017 / 19:17
1

com zsh :

autoload zmv # best in ~/.zshrc
zmv -n 't10n(<->)/data/file.dat(<->)' '$f:r.dat$(($1 * 5 + $2))'

(remova -n (para dry-run) quando feliz).

    
por 05.10.2017 / 19:26
0
Solução

find + bash + sed :

find . -type f -path "*t[0-9]*n[0-9]*/data/file.dat[0-9]*" -exec bash -c 'f=$1; 
      read v1 v2 < <(sed -E "s#.*/t[0-9]+n([0-9]+)/data/file\.dat([0-9]+)\$# #" <<<"$f"); 
      mv "$f" "${f/.dat[0-9]*/.dat}$(($v1*5+$v2))"' x {} \;
  • read v1 v2 ... - leia os números cruciais das variáveis t10n<number> e dat<number> em v1 e v2 , respectivamente
por 05.10.2017 / 18:11