Como remover caracteres finais em nomes de arquivos no Bash?

13

Eu tenho vários arquivos de mídia como os abaixo:

tvshow.s01e11]Bloodlines.avi
tvshow.s01e12]suffer.avi
tvshow.s01e13]NotMe.avi

Gostaria de renomeá-los para

tvshow.s01e11.avi
tvshow.s01e12.avi
tvshow.s01e13.avi

Eu tentei usar renomear, mas, evidentemente, não estou acertando na sintaxe porque ela falha.

    
por Widgeteye 28.08.2016 / 05:14

5 respostas

9

Isso renomeia os arquivos. Você precisa do \ w * para indicar qualquer número de caracteres alfanuméricos.

rename 's/\]\w*//' *

Referência: link

    
por 28.08.2016 / 05:52
14

No shell, pode-se fazer simplesmente:

for x in *]*.avi ; do 
    mv -i "$x" "${x%]*.avi}.avi"
done

O shell pode produzir uma lista dos nomes de arquivos com apenas uma glob regular, e ${var%pattern} remove o padrão de correspondência (mais curto) do final da string na variável var . Como a extensão final é sempre .avi , acabei de removê-la com o padrão e a adicionei de volta. Com as aspas, isso também deve funcionar com nomes de arquivos contendo espaços, como Fancy Name for a Show.s01e01]Asdf.avi

    
por 28.08.2016 / 10:37
2

Isso é totalmente impraticável - as outras respostas são muito mais rápidas e curtas - mas ...

Você pode usar o PowerShell! A Microsoft abriu o código-fonte recentemente e transformou isso em uma plataforma cruzada. Para obter downloads e instruções de instalação para seu sistema operacional, consulte a seção "Obter PowerShell" .

Uma vez instalado, você pode usar este breve script:

Get-ChildItem -File '*]*.avi' | ForEach-Object {
    Rename-Item $_ -NewName (($_.Name -Split ']')[0] + '.avi')
}

Basicamente, ele passa por cada objeto no diretório atual que é um arquivo correspondente a *]*.avi , obtém a parte antes do colchete, coloca .avi de volta nela e atribui isso como o novo nome.

Para executá-lo diretamente do Bash, use este one-liner semi-golfado:

powershell -command $'gci -File \'*]*.avi\'|%{rename-item $_ -NewName (($_.Name -Split \']\')[0]+\'.avi\')}'

Cite como escapar da cortesia esta resposta do Stack Overflow .

(Testado no Bash no Ubuntu no Windows. Há provavelmente uma forma muito mais curta de fazer isso com o PowerShell, mas eu queria mostrar algo compreensível para pessoas que não conhecem expressões regulares.)

    
por 28.08.2016 / 19:42
1

O Debian tem um pacote chamado mmv que também pode estar disponível em outras distribuições, e deve ser fácil o suficiente para compilar a partir da fonte, se não. Ele permite que você escreva isso:

mmv '*]*.avi' '#1.avi'

Você pode ler a página do manual do Ubuntu para obter mais detalhes sobre este comando.

    
por 29.08.2016 / 11:18
0

Isso irá procurar o padrão e substituir o texto usando sed.

 $sed 's/\(.*]\)[a-zA-z0-9].*\(.avi\)//' filename
    
por 31.08.2016 / 09:54