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