Como sua pergunta é marcada como Linux, você pode usar o comando rename
ou prename
(observe que prename
não está obsoleto, mas ainda funciona). Em ambos os casos, eles são scripts perl para renomeação baseada em padrões.
Com a correspondência de grupo e usando *.mp3
glob para passar apenas .mp3
arquivos, você pode fazer isso:
$ prename -nv 's/(^0*)(.*).mp3/$2.mp3/' *.mp3
Deprecated program in use: rename as shipped with the Debian perl package will be removed after the release of stretch. Please install the separate 'rename' package which will provide the same command.
000004500.mp3 renamed as 4500.mp3
00123.mp3 renamed as 123.mp3
00133.mp3 renamed as 133.mp3
00150.mp3 renamed as 150.mp3
Observe que -n
e -v
são para saída seca e detalhada; testando apenas. Remova -n
para que a renomeação real entre em vigor.
Caso você esteja confuso sobre rename
vs prename
, leia a resposta correspondente esclarece a confusão, mas ... Eu recomendaria que você não se incomodasse com isso. Muito complicado :) O ponto é que, em qualquer caso, funciona como mostrado, a menos que você esteja usando ksh
shell.
A maneira recursiva de renomear arquivos em subpastas seria via find
, no entanto, isso requer um pouco de acrobacia com padrão de substituição para manipular itens anteriores no caminho do arquivo, conforme fornecido por find
.
find ./testdir/ -type f -name "*.mp3" -exec prename -nv 's/(.*)(\/0*)(.*).mp3/$1\/$3.mp3/' {} \;
O comando acima foi executado da seguinte forma em um caso de teste:
$ find ./testdir/ -type f -name "*.mp3" -exec prename -nv 's/(.*)(\/0*)(.*).mp3/$1\/$3.mp3/' {} \; 2>/dev/null
./testdir/000004500.mp3 renamed as ./testdir/4500.mp3
./testdir/00150.mp3 renamed as ./testdir/150.mp3
./testdir/00133.mp3 renamed as ./testdir/133.mp3
./testdir/00123.mp3 renamed as ./testdir/123.mp3
Melhoria menor poderia ser especificar \d
, a classe de dígitos:
find ./testdir/ -type f -name "*.mp3" -exec prename -nv 's/\/0*(\d*\.mp3)/\/$1/' {} \;
Stéphane Chazelas mencionou na possibilidade de comentários onde /0/1.mp3
poderia ser acidentalmente renomeado para .//1.mp3
. Eu tomei casos de teste de casal; ./testdir/0/000987.mp3 renamed as ./testdir/0/987.mp3
e ./testdir/007/00123.mp3 renamed as ./testdir/007/123.mp3
foram os resultados. Eu acho que a combinação gananciosa de 0*
faz o truque.
Ele também sugeriu nos comentários adicionando [^/]
na correspondência de padrões de nome de arquivo. Essa é uma boa idéia, já que nomes de arquivos Unix não podem ter barras invertidas neles; caminhos podem, mas não arquivos individuais. No entanto, não sei ao certo como implementar melhor isso e ainda não tenho nenhuma sugestão sobre a correspondência de 0.mp3
ou 000.mp3
de tipos de nomes de arquivos.