Adiciona ou subtrai um número dos nomes de todos os arquivos em um diretório

2

Eu tenho um número de arquivos png e jpg cujos nomes são números, por exemplo, 0100.png , em um diretório,

  • Como posso adicionar 1 aos seus nomes, por exemplo, para obter 0002.png e 0003.png de 0001.png e 0002.png , respectivamente, sem sobrescrever?

  • Como posso subtrair 2 de seus nomes, para que 0100.png não se torne 098.png , mas 0098.png ?

Relacionadas link , mas mais difícil aqui.

    
por Tim 13.11.2014 / 23:46

3 respostas

3

Eu provavelmente acabaria usando o diretório temporário nesse caso:

for file in [[:digit:]]*.png; do
    echo mv $file tmp/$(printf %04d $((10#${file%.png}+1))).png
done

A parte importante é 10#N , que força o bash a interpretar 000N como apenas N , caso contrário, os zeros iniciais indicam números octais.

Por exemplo:

$ touch 0001.png 0002.png 0010.png 0020.png 0100.png 0200.png
$ for file in [[:digit:]]*.png; do echo mv $file tmp/$(printf %04d $((10#${file%.png}-1))).png; done
mv 0001.png tmp/0000.png
mv 0002.png tmp/0001.png
mv 0010.png tmp/0009.png
mv 0020.png tmp/0019.png
mv 0100.png tmp/0099.png
mv 0200.png tmp/0199.png
    
por 14.11.2014 / 00:21
2

A solução para (1)

Classifique os arquivos de acordo com seus números e comece a renomear com aquele com o número mais alto. Isso torna as colisões impossíveis.

ls *.png | sort -rn | while read ...; do ... mv ...; done

A solução para (2)

Determine o número de dígitos (se não for o mesmo para todos os arquivos) e use printf para manter esse tamanho:

printf %04d.png 98
0098.png
    
por 13.11.2014 / 23:50
1

Usando o rename do Perl:

-2:

$ rename -n 's@\b\d+\b@sprintf("%04d", $& - 2)@e'  0100.png
0100.png -> 0098.png

+1:

$ rename -n 's@\b\d+\b@sprintf("%04d", $& + 1)@e'  0001.png 0002.png
0001.png -> 0002.png
0002.png -> 0003.png

Você pode remover o -n (comutador do modo dry-run) quando seus testes se tornarem válidos.

aviso http://pix.toile-libre.org/upload/original/1377510865.png Existem outras ferramentas com o mesmo nome que podem ou não ser capazes de fazer isso, então seja cuidadoso.

Se você executar o seguinte comando ( linux )

$ file $(readlink -f $(type -p rename))

e você tem um resultado como

.../rename: Perl script, ASCII text executable

então esta parece ser a ferramenta certa =)

Se não, para torná-lo o padrão (normalmente já é o caso) em Debian e derivado como Ubuntu :

$ sudo update-alternatives --set rename /path/to/rename

(substitua /path/to/rename pelo caminho do comando perl's rename .

Se você não tiver esse comando, pesquise seu gerenciador de pacotes para instalá-lo ou faça isso manualmente

Por último, mas não menos importante, esta ferramenta foi originalmente escrita por Larry Wall, o pai do Perl.

    
por 14.11.2014 / 00:27