Como solução possível, você pode usar qualquer ferramenta para converter arquivos em fluxo não compactado ( pcm
, wav
) sem informações de metadados e compará-las. Para a conversão, você pode usar qualquer software que desejar ffmpeg
, sox
ou avidemux
.
Por exemplo, como faço isso com o ffmpeg
Digamos que eu tenha nesse exemplo 2 arquivos com metadados diferentes: a
$ diff Original.mp3 Possible-dup.mp3 ; echo $?
Binary files Original.mp3 and Possible-dup.mp3 differ
comparação de força bruta reclama que eles são diferentes.
Então nós apenas convertemos e diferenciamos o corpo:
$ diff <( ffmpeg -loglevel 8 -i Original.mp3 -map_metadata -1 -f wav - ) <( ffmpeg -loglevel 8 -i Possible-dup.mp3 -map_metadata -1 -f wav - ) ; echo $?
0
A ; echo $?
parte fora do curso é apenas para fins de demonstração para ver o código de retorno.
Processando vários arquivos (diretórios transversais)
Se você quiser tentar duplicatas em coleção que tem valor para checksums calcular (qualquer como crc
, md5
, sha2
, sha256
) de dados e, em seguida, basta encontrar lá colisões.
Embora esteja fora do escopo dessa pergunta, eu sugeriria algumas sugestões simples de como encontrar duplicatas de arquivos na contabilidade de diretório, apenas o conteúdo sem a consideração de metadados.
- Primeiro, calcule o hash de dados em cada arquivo (e coloque-o no arquivo para o próximo processamento): O
for file in *.mp3; do printf "%s:%s\n" "$( ffmpeg -loglevel 8 -i "$file" -map_metadata -1 -f wav - | sha256sum | cut -d' ' -f1 )" "$file"; done > mp3data.hashes
arquivo será semelhante a:
$ cat mp3data.hashes
ad48913a11de29ad4639253f2f06d8480b73d48a5f1d0aaa24271c0ba3998d02:file1.mp3
54320b708cea0771a8cf71fac24196a070836376dd83eedd619f247c2ece7480:file2.mp3
1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Original.mp3
8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other-dup.mp3
8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other.mp3
1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Possible-dup.mp3
Qualquer RDBMS será muito útil para agregar a contagem e selecionar esses dados. Mas continue com a solução pura de linha de comando, que você pode querer seguir etapas simples.
Veja hashes duplicados, se houver (etapa extra para mostrar como funciona, não é necessária para encontrar dupes):
$ count.by.regexp.awk '([0-9a-f]+):' mp3data.hashes
[1:54320b708cea0771a8cf71fac24196a070836376dd83eedd619f247c2ece7480]=1
[1:1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f]=2
[1:ad48913a11de29ad4639253f2f06d8480b73d48a5f1d0aaa24271c0ba3998d02]=1
- E todos juntos para listar arquivos duplicados pelo conteúdo :
$ grep mp3data.hashes -f <( count.by.regexp.awk '([0-9a-f]+):' mp3data.hashes | grep -oP '(?<=\[1:).{64}(?!]=1$)' ) | sort
1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Original.mp3
1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Possible-dup.mp3
8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other-dup.mp3
8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other.mp3
count.by.regexp.awk é um awk
script simples para contar padrões de regexp.