Removendo números e hifens de nomes de arquivos recursivamente

7

Estou modificando um script BASH simples para remover números e hifens desde o início dos meus arquivos MP3. O objetivo é renomear arquivos como:

  • 11 Músicas 1.mp3
  • 1-1-Canção 2.mp3
  • 11-1 Canção 3.mp3

para:

  • Música 1.mp3
  • Música 2.mp3
  • Canção 3.mp3

Eu tenho este script que funciona para todos os arquivos no diretório atual

$ for f in [0-9]*; do mv "$f" "'echo $f | sed 's/^[0-9]*\W*//''"; done

e modificá-lo para procurar todos os arquivos dentro de subpastas:

#!/bin/bash

dir=''

IFS='
'
for f in $(find $dir * -type f) ; do
  mv "$f" "'echo $f | sed 's/^[0-9]*\W*//''"; 
done

O problema é que o valor $f retorna a subpasta e o nome do arquivo e a linha mv procura os arquivos que começam com [0-9], portanto, os arquivos dentro de uma subpasta não estão sendo renomeados.

Por exemplo O arquivo mp3/1-1 Song 1.mp3 começa mp3/ , não inicia com um numérico, por isso não é renomeado.

Existe uma maneira de ler os valores de diretório e arquivo em variáveis separadas ou existe uma maneira melhor de fazer isso?

Obrigado

    
por Stephen Provis 16.10.2012 / 14:14

3 respostas

4

encontre & amp; sed:   Gostaria de pedir-lhe para primeiro remover o pipe e sh no final, e ver se o comando mv está sendo gerado corretamente, e então você pode executar o comando como tal:

find $dir -type f | sed 's|\(.*/\)[^A-Z]*\([A-Z].*\)|mv \"&\" \"\"|' | sh
    
por Guru 16.10.2012 / 14:32
2

Não há necessidade de um script, há um forro para isso.

Tente ver o que ele faz (não se preocupe, isso não renomeia seus arquivos ainda, veja abaixo):

find root_audio_path -type f -iname '*mp3' -execdir rename --no-act 's/^\.\/[\d\s\-]+/\.\//' '{}' ';'

Remova --no-act se parecer funcionar. Isso realmente renomeia os arquivos.

A opção -execdir de find garante que rename seja executado no diretório de arquivos, portanto, os caminhos dos arquivos sempre começam com ./ - para o qual procuramos em rename .

rename no Ubuntu perls renomeia, então você pode usar expressões regulares lá.

    
por phoibos 16.10.2012 / 14:56
0

A seguir, você verá o caminho

echo "wwww/www/mp3/1-1 Song 1.mp3" | sed 's#\(.*/\)\(.*\)##g'
/wwww/www/mp3/

A seguir, você obterá o arquivo sem o caminho:

echo "wwww/www/mp3/1-1 Song 1.mp3" | sed 's#\(.*/\)##g'
1-1 Song 1.mp3

Você precisará de uma variável para o caminho, nomes de arquivos antigos e novos. Você pode obter o novo nome de arquivo usando seu código e construir um caminho de origem e de destino usando essas variáveis. Eu recomendo fazer um dry-run onde você ecoa o alvo anexando a um arquivo. Então você pode verificar por d

    
por Romski 16.10.2012 / 14:32

Tags