Unix Bash renomeia arquivos usando um regex

4

Gostaria de renomear todos os arquivos de uma pasta usando um regex (adicionar um nome ao final do nome) e ir para outra pasta.

Na minha opinião, deveria estar assim:

mv -v ./images/*.png ./test/*test.png , mas não está funcionando.

Alguém pode me sugerir uma solução?

    
por mxg 25.12.2009 / 15:37

3 respostas

6

Eu também gosto do comando rename que John T postou, mas não está disponível em todos os sistemas. Isso deve funcionar em todos os lugares:

for i in *.png; do mv -v $i 'basename $i .png'.test.png; done
    
por 25.12.2009 / 15:52
7

Existe um prático script de renomeação de arquivos perl que é instalado com o pacote Perl principal em sistemas baseados em Debian (incluindo o Ubuntu). Geralmente é denominado rename , mas às vezes é chamado de prename (renomeação de Perl). Use assim:

rename expr file1 file2 file3

O comando usa Perl para avaliar expr para cada argumento file e renomeia cada arquivo para a saída da expr evalutation. Então, para substituições de regex simples, como seu exemplo:

rename 's(images/(.*)\.png$)(test/$1.test.png)' ./images/*

# here's the expression:
# s()()   -- just like s/// (but i don't need to escape the / in the filename)
#   match regex:  images/(.*)\.png$     -- match filenames of the form images/*.png
#   replace:      test/$1.test.png     -- turn them into test/*.test.png

Se os arquivos não corresponderem à expressão (por exemplo, arquivos não-PNG), a substituição não fará nada e seus nomes de arquivo não serão alterados.

    
por 25.12.2009 / 18:18
2

Você pode usar rename , que aceita expressões regulares ou esta sintaxe básica de 3 argumentos:

rename .png .test.png *.png
  • O primeiro argumento é o que substituir no nome do arquivo
  • O segundo argumento é o que substituí-lo por
  • O terceiro argumento é quais arquivos executar a operação, neste caso, todos os pngs.
por 25.12.2009 / 15:44

Tags