Existe uma maneira de alterar rapidamente todas as extensões de arquivos de uma pasta?

14

Eu tenho uma pasta grande de livros de áudio .m4b que, no formato atual, não é reproduzido no meu telefone Android. No entanto, eles funcionam bem se forem renomeados para .m4a

Existe um método rápido ou comando de terminal que pode renomear todos os arquivos .m4b em uma pasta para .m4a? Não há necessidade de qualquer conversão dos arquivos, simplesmente renomear a extensão do arquivo funciona perfeitamente bem.

cobertura
fonte
2
FYI: renameé um script PERL e aceita expressões regulares. Os sistemas Debian também têm um rename.ulcomando como parte do util-linux-ng package. Se o perl não está instalado (ok, altamente improvável;)) renametambém não está.
Rinzwind 22/12/12

Respostas:

16

Isso fará o trabalho para você.

rename 's/.m4b$/.m4a/' *.m4b

Para uma execução de teste, você pode usar este comando:

rename 's/.m4b$/.m4a/' *.m4b -vn

-v significa "detalhado" e exibirá os nomes dos arquivos quando os renomear.

-n fará um teste em que não renomeie nenhum arquivo, mas mostrará uma lista dos arquivos que seriam renomeados.

Basharat Sialvi
fonte
Resposta muito melhor que a minha. Eu estava sendo preguiçoso e tentando não usar expressões regulares ...
adempewolff
Obrigado, trabalha um prazer. Obrigado a @adempewolff pelo esforço também
coversnail
10

Uma maneira muito rápida de renomear arquivos, se é tudo o que você precisa fazer e não precisa convertê-los para outro formato, é usar as expansões de parâmetros do Bash, que são detalhadas muito bem no wiki do Bash .

Existem várias maneiras diferentes de alterar a extensão, mas eu uso aqui o ${var/original/replacement}paradigma simples :

for file in *.m4b; do mv -- "${file}" "${file/%m4b/m4a}"; done

Se você quiser ver o que seria alterado pelo comando, coloque echo antes mve as alterações serão listadas.

Escusado será dizer que este oneliner também pode ser modificado para outros arquivos, e você também pode usar expansões de parâmetros para remover extensões de arquivo.


fonte
+1 Dessa forma, funciona da mesma forma que a resposta de @Basharat Sial, exceto que também funcionará quando houver muitos arquivos correspondentes *.m4b. Caso contrário, você atingirá o erro argument list too long.
Matt queima
Além disso, para ver isso acontecer, adicione a bandeira detalhada:for file in *.m4b; do mv -v -- "${file}" "${file/%m4b/m4a}"; done
matt burns