Eu tenho muitos (cerca de 6000!) mp3s que gostaria de despejar em subdiretórios, com base no nome do arquivo. Atualmente eles estão todos em um único subdiretório. (Já existem alguns diretórios existentes para alguns artistas, não desejo tocar nos arquivos neles, no entanto, uma duplicata sobrescrevendo um arquivo existente é aceitável).
A maneira mais simples que vejo de fazer isso é criando um subdiretório com base no nome do arquivo, já que os arquivos são todos denominados artist.artist.album.track.mp3.
Depois de algumas pesquisas cheguei a:
for x in ./*.mp3; do awk x="${x}" -F. '{split(x,a,"."); mkdir a[1]; mv x a[1]/}'; done
No entanto, ele me diz que há um erro de sintaxe e regexp não terminado:
awk: cmd. line:1: x=./Dizzee.Rascal.Radio.1.Live.Lounge.03.That.s.Not.My.Name.mp3
awk: cmd. line:1: ^ syntax error
awk: cmd. line:1: x=./Dizzee.Rascal.Radio.1.Live.Lounge.03.That.s.Not.My.Name.mp3
awk: cmd. line:1: ^ unterminated regexp
awk: cmd. line:1: x=./Dizzee.Rascal.Ultimate.Streetdance.CD1.03.Flex.Dave.Spoon.Mix.mp3
awk: cmd. line:1: ^ syntax error
awk: cmd. line:1: x=./Dizzee.Rascal.Ultimate.Streetdance.CD1.03.Flex.Dave.Spoon.Mix.mp3
awk: cmd. line:1: ^ unterminated regexp
Acho que é porque o nome do arquivo não é fornecido entre marcas de fala, mas não tenho 100% de certeza.
Alguém pode ajudar - e pontos de bônus se você conseguir imprimir o progresso também.
Por quê
awk
? OK, vamos suporawk
…x="${x}"
antes do que você deseja que seja um programa-v
(ou seja-v x="${x}"
, ), caso contrário, é interpretado como um programa. Esta é a razão pela qual você obtém erros de sintaxe.awk
chamada; então você precisaBEGIN
.a[1]
; talveza[2]
./
(ou seja, sem aspas no contexto deawk
, não no shell) está errado.mkdir
emv
não são ações emawk
. Eu acho que eles são interpretados como variáveis (vazias). Hásystem
ação, você pode usá-la. Mas como você precisa passar um nome de arquivo/diretório arbitrário, surgem esses problemas:Eu digo para esquecer
awk
aqui. O código abaixo assume que você deseja diretórios nomeados a partir dos dois primeiros segmentos separados por pontos. Notas:foo.mp3
acionará um erro demkdir -p ./foo.mp3/
;Em qualquer caso, aconselho criar um diretório separado para trabalhar:
Isso usa hardlinks, por isso é rápido e quase não ocupa espaço em disco adicional. Processe a estrutura de diretório dentro
my_music_copy/
de . Se você errar muito, sempre pode se livrarmy_music_copy/
e começar de novo. Só depois de ter certeza de que tudo está em seu lugar dentromy_music_copy/
de , removamy_music/
e renomeiemy_music_copy/
paramy_music/
.Se não houver um número fixo de segmentos e alguma heurística for necessária, tente
vidir
; algo assim:Então você pode usar o recurso "pesquisar e substituir" do editor escolhido para criar diretórios desejados de forma confiável (por exemplo, substituir
./Dizzee.Rascal.
por./Dizzee.Rascal/
; mas./Mozart.
com./Mozart/
e./W.A.Mozart.
com./W.A.Mozart/
ou talvez com./Mozart/
também). Veja esta minha resposta .Vantagens: