Como excluir arquivos de música duplicados em que pelo menos uma versão é .flac

2

Eu tive que consolidar vários diretórios de música e acabei com muitos arquivos duplicados. Nos casos em que um é um .flac, eu gostaria de me livrar dos enganados e manter o .flac. Gostaria de comparar apenas os arquivos que estão na mesma pasta, pois eles representam álbuns, o que é uma maneira útil de organizar minha música.

Estou executando o Ubuntu 15.10, com um shell bash.

Gostaria de receber sua ajuda com as ferramentas de linha de comando. Muito obrigado,

    
por mxr 06.01.2016 / 03:12

1 resposta

1

Antes de responder à sua pergunta, tenho algumas suposições: Digamos que você tenha um diretório como este

$ ls -1 myMusics
music1
music1.flac
music1.mp3
music2.mp3
music2b.mp3
music3.flac
music4.flac
music4.wav
music5b.flac
music6
music6.mp3
music6.wav

No diretório acima, somente music1.flac e music4.flac duplicados serão removidos, porque music2.mp3 , music2b.mp3 , music3.flac e music5b.flac não têm duplicatas a serem removidas e, embora music6 tenha duplicados, nenhum deles tem .flac extensão. Eu também assumi que não há nenhum arquivo como music1.backup.flac em seu diretório. Se tais arquivos existirem, eles serão tratados como music1.flac duplicados (se houver).

Com base nas suposições , você pode fazer isso:

$ shopt -s extglob
$ for i in 'ls | egrep .flac$ | sed 's/\.flac$//''; do rm "$i".!(flac);done 2>/dev/null
$ shopt -u extglob

Agora vamos ver o que os comandos acima fazem:

  1. O segundo item lista todos os arquivos que têm .flac extensão no final ( ls | egrep .flac$ ),
  2. , em seguida, remove o .flac do final do nome ( | sed 's/\.flac$// ),
  3. em seguida, para cada um dos nomes resultantes de duas etapas anteriores, remove todos os arquivos com esse nome e uma extensão,
  4. , exceto os que têm .flac extensão. rm "$i".!(flac) remove todos os arquivos que começam com "$i" e excluem aqueles que têm .flac extensão. Se você não executar shopt -s extglob (ou seja, se você não habilitar extglob ), padrões como "$i"!(.flac) não terão nenhum significado especial e bash procurará pelo nome do arquivo "$i"!(.flac) exatamente. (o nome "$i" seguido por ! e, em seguida, ( e assim por diante.)
  5. No final, você pode desativar extglob usando shopt -u extglob .

Você pode ver o seguinte sobre extglob in man bash :

  

Se a opção de shell extglob estiver ativada usando o shopt builtin , vários   operadores de correspondência de padrões são reconhecidos. Na descrição a seguir, uma lista de padrões é uma lista de um ou mais padrões separados por um |. Padrões compostos   pode ser formado usando um ou mais dos seguintes sub-padrões:

     
  • ? (pattern-list)
      Corresponde a zero ou uma ocorrência dos padrões fornecidos
  •   
  • * (lista de padrões)
      Corresponde a zero ou mais ocorrências dos padrões fornecidos
  •   
  • + (lista de padrões)
      Corresponde a uma ou mais ocorrências dos padrões fornecidos
  •   
  • @ (lista de padrões)
      Corresponde a um dos padrões fornecidos
  •   
  • ! (pattern-list)
      Corresponde a qualquer coisa, exceto um dos padrões fornecidos
  •   

Além disso, dê uma olhada nessa pergunta: < Como posso usar curingas inversas ou negativas quando a correspondência de padrões em um shell unix / linux?

    
por Mohammad 06.01.2016 / 09:05