Renomeie arquivos para alterar pontuação e numeração

5

Eu estava esperando que alguém com melhores habilidades de regex pudesse me ajudar com alguns arquivos que eu preciso renomear. Eu preciso de um comando para renomear recursivamente um grande número de arquivos jpg no Ubuntu.

No entanto, existem alguns problemas. Um grupo normal de arquivos seria parecido com ani-estate-villas_1431640729_3.jpg , ani-estate-villa_3627544278_7.jpg e ani-estate-villa_3143254376_5.jpg

Eu preciso substituir todos os - por _ , remover todos os números e adicionar numeração que é redefinida em todos os diretórios. Portanto, o mesmo grupo de arquivos deve se parecer com ani_estate_villas_1.jpg , ani_estate_villas_2.jpg , ani_estate_villas_3.jpg e o mesmo com os outros arquivos nos outros diretórios.

A profundidade da recursão é de 1 ou 2 diretórios, então você pode achar que um directory/file.jpg ou directory/directory/file.jpg é praticamente aleatório.

Executar um comando em todos os diretórios com jpgs também é factível, portanto, se alguém tiver alguma idéia sobre como renomear todos os arquivos com essas características, tudo bem. Embora rodar um único comando seja mais legal, eu apreciaria muito mais uma solução repetitiva, porque alterar manualmente os 400 + jpg é muito.

Eu tentei toneladas de coisas, mas eu nem estou perto, nem vale a pena colocá-lo aqui. Eu tentei usar krename mas apaga meus arquivos. Então, se alguém pudesse me apontar na direção certa, eu apreciaria muito!

    
por Henry Ollarves 17.01.2017 / 00:29

1 resposta

2

Você pode usar o comando prename para renomear arquivos com base em uma transformação escrito em Perl .

Vamos começar de maneira simples. Para renomear todos os arquivos .jpg em um diretório, alterando todos os - para _ , podemos apenas usar o s operator (também poderíamos usar tr ). O código Perl é executado para transformar cada nome de arquivo.

prename 's!-!_!g' *.jpg

Para alterar a (s) sequência (s) numérica (s) no final para um contador simples, introduzimos uma variável de contador. Eu uso a variável global $a como um contador (a introdução de variáveis extras é mais complicada). A expressão regular (\.[^/.]*)$ corresponde à extensão do arquivo e $1 no texto substituto representa o que o grupo entre parênteses correspondeu.

prename 's!-!_!g; ++$a; s!_[0-9_]+(\.[^/.]*)$!_$a$1!' *.jpg

Observe que os arquivos são renomeados na ordem dada pelos argumentos do nome do arquivo, ou seja, a ordem de expansão de *.jpg determina a numeração dos arquivos.

Como alternativa, podemos inicializar o contador explicitamente com um bloco BEGIN .

prename 'BEGIN {$a = 1;} s!-!_!g; s!_[0-9_]+(\.[^/.]*)$!_$a$1!; ++$a;' *.jpg

Para realizar isso em todos os subdiretórios do diretório atual, chame find .

find -type d -exec sh -c 'cd "$1" && prename "$0" *.jpg' 's!-!_!g; ++$a; s!_[0-9_]+(\.[^/.]*)$!_$a$1!' {} \;
    
por 17.01.2017 / 01:46