Batch renomeando o texto específico dentro do nome da pasta

1

Existe uma maneira de alterar a capitalização de texto para pastas, mas deixar o texto entre colchetes inalterado? Existe uma maneira possível de fazer este pyRenamer?

Por exemplo, se as pastas forem nomeadas:

dogs bark - cats miaow [DBCM001]
james peach - jack beanstalk [JPJB521]
small pond - big fish (revive) [FIN07CD]

Mude para:

Dogs Bark - Cats Miaow [DBCM001]
James Peach - Jack Beanstalk [JPJB521]
Small Pond - Big Fish (revive) [FIN07CD]

Todo o texto entre parênteses é inconsistente. Existem mais de 1000 pastas para renomear!

Como eu poderia fazer isso?

    
por user779373 06.01.2018 / 13:26

1 resposta

2

Você pode fazer isso com rename :

$ rename -n 's/(?<![([])(\b\w)/uc()/eg' */
dogs bark - cats miaow [DBCM001]/ -> Dogs Bark - Cats Miaow [DBCM001]/
james peach - jack beanstalk [JPJB521]/ -> James Peach - Jack Beanstalk [JPJB521]/
small pond - big fish (revive) [FIN07CD]/ -> Small Pond - Big Fish (revive) [FIN07CD]/

O -n faz rename imprimir o que faria sem realmente fazer nada. Remova o -n quando tiver certeza de que funciona como você deseja.

O s/from/to/ é o operador de substituição e substituirá from por to . Aqui estou dando:

  • (?<![([]) : isso é chamado de lookbehind negativo . O formato geral é (?<!foo) e significa "ignorar quaisquer correspondências se a palavra anterior for foo ". Aqui, eu estou dando a ela o patern [([] , essa é uma classe de caracteres (definida por [ ] ) que consiste nos caracteres: [ e ( . Então, a coisa toda significa "ignorar todas as correspondências que vêm logo depois de um [ ou um ( .

  • (\b\w) : o \b corresponde a um "limite de palavras" . Essa é uma âncora de 0 comprimento que corresponde ao ponto de transição entre uma palavra e uma não palavra. Assim, por exemplo, corresponde no início da linha, ou em um espaço, ou em qualquer outro caractere não-palavra. O \w , por outro lado, corresponde a um caractere de palavra. Portanto, \b\w corresponde à primeira letra de uma palavra. Os parênteses em torno dele "capturam" para que possamos nos referir a ele como no lado direito do operador de substituição.

  • uc() : é com isso que substituímos o que combinamos. Conforme explicado acima, como a correspondência está entre parênteses, agora podemos nos referir a ela como . uc() é uma função Perl que torna as coisas MAIORES. Então isso significa apenas "imprimir a partida em maiúsculas".

  • eg : essas são opções que afetam o comportamento de s/// . Especificamente, o e permite a execução de comandos no lado direito, o que nos permite usar uc() e o g aplica a substituição globalmente a todas as correspondências na linha.

Finalmente, */ significa "executar o comando em todos os diretórios no diretório atual".

Se você também deseja colocar as palavras entre parênteses em maiúsculas, use:

$ rename -n 's/(?<!\[)(\b\w)/uc()/eg' */
dogs bark - cats miaow [DBCM001] -> Dogs Bark - Cats Miaow [DBCM001]
james peach - jack beanstalk [JPJB521] -> James Peach - Jack Beanstalk [JPJB521]
small pond - big fish (revive) [FIN07CD] -> Small Pond - Big Fish (Revive) [FIN07CD]
    
por terdon 06.01.2018 / 13:53