bash script para ordenar as duplicatas no arquivo de texto

2

Eu converti todo o flac na minha biblioteca de músicas para mp3, para que eu possa mover o flac para uma unidade externa. Eu usei o dbpoweramp no windows, e tenho certeza que ele converteu todos eles, mas quando eu acordei esta manhã, o netbook foi reiniciado.

Então, fiz uma lista com todas as minhas músicas e usei o tipo para alfabetizá-la. Então eu tenho algo assim:

~/music/a/a.flac
~/music/a/a.mp3
~/music/a/b.flac
~/music/a/b.mp3
~/music/b/a.mp3
~/music/b/b.mp3
~/music/c/a.flac
~/music/c/a.mp3

Note que eu tenho um diretório com apenas mp3, já que nem toda minha biblioteca era flac.

O que eu quero é um script bash que irá verificar se todas as linhas que terminam com .flac têm uma linha diretamente abaixo delas que é a mesma, exceto que termina com .mp3.

Como eu conseguiria isso, e se você puder explicar o que o script está fazendo, isso também seria legal.

Eu acho que é importante mostrar as linhas que terminam com .flac que NÃO têm um .mp3 correspondente, pois elas precisam ser convertidas ainda.

    
por Rob 27.10.2011 / 16:45

3 respostas

2
awk '
    root && $0 != root ".mp3" {printf("%d: %s.flac\n", line, root)}
    /.flac$/ {
        root=$0
        sub(/.flac$/, "", root)
        line = NR
        next
    }
    { root = "" }
' filename

Como isso funciona?

Começando com a linha que começa com /.flac$/ , para cada linha que termina com ".flac", crie uma variável chamada root contendo a linha menos a extensão. Salva o número da linha atual. Pule para a próxima linha para evitar apagar a variável raiz que acabou de ser definida.

Indo para a primeira linha. Esta expressão root && $0 != root ".mp3" significa: root é não vazia E a linha atual ( $0 ) não é igual ao valor da variável raiz mais ".mp3". Se essa expressão for avaliada como verdadeira, a linha atual não será o arquivo MP3 correspondente ao arquivo FLAC anterior.

A última linha apaga o valor da variável raiz. Essa parte do script é alcançada apenas se a linha atual não for um arquivo FLAC, portanto, não queremos fazer a comparação com a próxima linha.

    
por 27.10.2011 / 17:02
1

Eu encontrei uma maneira diferente de fazer isso, usando o diff, mas ainda não o fiz em um script bash. Vou postar aqui se eu encontrar uma maneira de fazer isso.

Glenn postou um ótimo roteiro que funciona, mas aqui está como acabei fazendo isso.

Eu fiz dois arquivos classificados, um com .flac e outro com .mp3 com find ~/music -name *.flac | sort > ~/documents/flac e find ~/music -name *.mp3 | sort > ~/documents/mp3

Então eu removi as extensões no vim

vim ~/documents/flac
:%s/.....$//
:w
:e ~/documents/mp3
:%s/....$//
:wq

E então eu fiz diff ~/documents/mp3 ~/documents/flac | grep '>' , que não mostraria nada se tudo fosse feito corretamente, e mostraria as linhas de flacs que não tinham mp3.

Tenho certeza que coloco isso em uma ou mais linhas, mas a resposta de Glenn funcionou muito bem com o arquivo que eu tinha.

    
por 27.10.2011 / 16:58
1

É possível também usar o find.

Com o uso de loop while após a localização:

find . -name '*.flac' | while read file ; do test -f 'dirname $file'/'basename $file .flac'.mp3 && echo $file; done

Com o uso de (muitas) subpastas:

find . -name '*.flac' -exec sh -c 'test -f 'echo {} |sed s/\.flac$/.mp3/' && echo {}' \;
    
por 27.10.2011 / 18:33

Tags