O comando rename
incluído no Perl (e também com muitas distribuições Linux também) pode fazer isso com bastante facilidade :
rename 's%(\d+)%$1/5-1%e' sol-temp_*.png
A string entre aspas simples é avaliada como código Perl e usada para modificar cada nome de arquivo.
Especificamente, s%foo%bar%
é um operador de correspondência e substituição de expressão regular. (Normalmente, um escreveria como s/foo/bar/
, mas eu queria usar uma barra na substituição, então escolhi um delimitador diferente.) O regexp (\d+)
corresponde à primeira seqüência de um ou mais dígitos no nome do arquivo e armazena na variável $1
para a substituição. A opção e
no final faz com que a substituição $1/5-1
seja avaliada como um código Perl, portanto, retorna o número armazenado em $1
dividido por 10, menos um.
Se você não tiver o comando rename
instalado (ou se o seu rename
funciona de maneira diferente; existem vários comandos Unix ao redor usando esse nome), mas você tem o Perl, você pode obter praticamente mesmo efeito assim:
perl -e 'for (<sol-temp_*.png>) {$o = $_; s%(\d+)%$1/5-1%e; rename $o, $_}'
Note, no entanto, que esta versão não tem verificação de erros ou salvaguardas contra a substituição de arquivos; esses não são muito difíceis de adicionar, mas tornam o código um pouco longo demais para um one-liner. Se você não se importa de escrever um roteiro completo, algo assim deve funcionar:
#!/usr/bin/perl
use strict;
use warnings;
foreach (<sol-temp_*.png>) {
my $orig = $_;
s%(\d+)%$1/5-1%e; # map "0010" -> "1", "0015" -> "2", etc.
next if $orig eq $_;
warn "$0: $_ exists, not renaming $orig\n" and next if -e $_;
rename $o, $_ or warn "$0: error renaming $orig to $_: $!\n";
}
(Você pode até mesmo modificar facilmente o script acima para ler o código de substituição e os nomes dos arquivos na linha de comando, apenas alinhe o script rename
, mas isso está além do escopo desta resposta.)