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.
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.
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:
dat number t10n number 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
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).
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 Tags bash rename files linux shell-script