Removendo parte específica do nome do arquivo (depois do segundo traço) para todos os arquivos em uma pasta

5

Eu uso o utilitário de linha de comando youtube-dl para baixar vídeos do YouTube e fazer mp3s deles com avconv . Estou fazendo isso no Ubuntu 14.04 e muito feliz com isso.

O utilitário faz o download dos arquivos e os salva com o seguinte esquema de nomes:

TITLE(artist-track)-ID.mp3

Assim, um nome de arquivo real se parece com:

EPIC RAP BATTLE of MANLINESS-_EzDRpkfaO4.mp3

Alguns outros nomes de arquivos na pasta parecem:

EPIC RAP BATTLE of MANLINESS-_EzDRpkfaO4.mp3
Martin Garrix - Animals (Official Video)-gCYcHz2k5x0.mp3
Stromae - Papaoutai-oiKj0Z_Xnjc.mp3

No começo, isso não foi problema. Não me incomodou enquanto ouvia minha música no Rhytmbox. Mas quando se muda para telefone ou outros dispositivos, é bastante confuso ver um nome tão longo, e alguns jogadores, como os da Samsung, tratam a última parte (id após segundo traço) do nome como Álbum ou algo assim.

Eu gostaria de criar um script bash que remova o que está depois do segundo traço no nome de todos os arquivos, então isso os tornará assim:

De: Martin Garrix - Animals (Official Video)-gCYcHz2k5x0.mp3

Para: Martin Garrix - Animals (Official Video).mp3

Também é possível instruir youtube-dl para excluir o ID a partir de agora?

Estou baixando atualmente com o comando:

youtube-dl --extract-audio --audio-quality 0 --audio-format mp3 URL
    
por Bodo 11.06.2014 / 16:16

5 respostas

2
O

sed pode conseguir isso em uma única linha, embora de maneira bastante complicada.

ls | sed 's/\(.*\)\(-.*\)/mv \"&\" \".mp3\"/' | bash

Primeiro, lista os arquivos no diretório atual (assumindo que todos os arquivos que você deseja renomear estão no diretório atual) e, em seguida, usa o comando s / regex / replacement do sed para gerar um comando sensitivo mv que é canalizado para o bash que executa. Isso pressupõe que todos os seus arquivos sejam do tipo "A-C.mp3" ou "A-B-C.mp3". Veja como funciona:

A parte regex do comando sed é

\(.*\)\(-.*\)

isso "agrupa" o nome em dois agrupamentos (delimitados por parênteses com escape): um correspondente ". *" (qualquer número de qualquer caractere) e outro correspondente "-. *", um traço seguido por qualquer número de qualquer caractere . Observe que isso corresponde ao nome do arquivo inteiro (em dois grupos). Observe também que, como o regex "ganancioso" é usado, o primeiro grupo corresponderá a "A" em "AC.mp3" e "A - B", não apenas "A", em "A - BC.mp3", conforme desejado.

A parte de substituição do comando sed é

mv \"&\" \".mp3\"/

Observe que um & amp; o caracter instrui o sed a inserir o padrão inteiro que corresponde ao regex, neste caso, o nome inteiro do arquivo, e o \ 1 instrui o sed para inserir a parte do nome do arquivo que correspondeu ao primeiro agrupamento ". *". Esses dois são combinados com um mv precedente e um .mp3 à direita, com aspas escapadas para produzir um comando de renomeação sensato. Por exemplo, para "A - B-C.mp3", o comando full sed produzirá:

mv "A - B-C.mp3" "A - B.mp3"

E finalmente tudo isso é canalizado para o bash, que executa o comando mv (rename).

    
por icasdri 11.06.2014 / 17:05
11

Eu usaria o comando rename baseado em Perl - por exemplo, para remover a sequência mais curta de caracteres de palavra que começam com - à frente do sufixo .mp3 , tente

rename -nv -- 's/-\w+?[.]mp3$/.mp3/' *.mp3

A opção n executa o comando no modo 'dry run' - se as correspondências parecerem corretas, remova a opção n e execute-a novamente.

    
por steeldriver 11.06.2014 / 16:42
7

A parte que você não quer é o ID do vídeo. Você pode usar a funcionalidade de modelo de saída do youtube-dl:

--output "%(title)s"

isso usará apenas o título e omitirá o id. Execute youtube-dl sem parâmetros para ver outras opções.

Você pode corrigir seus downloads existentes:

for i in *; do mv "$i" 'basename "$i" .mp3 | cut -f -2 -d "-"'.mp3; done

(Isto é equivalente à resposta de Jakke).

    
por roadmr 11.06.2014 / 16:36
2

Você pode verificar com este comando:

for i in *.mp3; do echo "$(echo $i|cut -d- -f1,2).mp3"; done

Observe que você tem nomes de arquivo sem dois traços, por isso não funcionará para tudo.

Se você realmente quiser mudar os nomes,

for i in *.mp3
do
  newname="$(echo $i|cut -d- -f1,2).mp3";
  mv $i $newname
done
    
por Jakke 11.06.2014 / 16:31
0

Uma solução usando apenas o shell:

filename=foo-bar-baz

while read -rd-; do
    newname="${newname:+$newname-}$REPLY"
done <<< "$filename"

mv "$filename" "$newname"

Isso funciona porque o nome do arquivo não termina com um traço, então o último token é ignorado.

    
por nyuszika7h 11.06.2014 / 21:02

Tags