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 forfoo". 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\bcorresponde 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\wcorresponde à primeira letra de uma palavra. Os parênteses em torno dele "capturam" para que possamos nos referir a ele comono 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 des///. Especificamente, oepermite a execução de comandos no lado direito, o que nos permite usaruc()e ogaplica 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]