Alterando os números de seqüência dos arquivos no Linux

0

É possível escrever um script para renomear uma série de arquivos conforme abaixo:

  • sol-temp_0010.png to sol-temp_1.png
  • sol-temp_0015.png to sol-temp_2.png
  • sol-temp_0020.png to sol-temp_3.png

etc?

    
por saturn 27.08.2013 / 00:34

1 resposta

1

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.)

    
por 27.08.2013 / 01:55