Come possibile soluzione, è possibile utilizzare qualsiasi strumento per convertire il file in flusso non compresso ( pcm
, wav
) senza informazioni sui metadati e quindi confrontarlo. Per la conversione è possibile utilizzare qualsiasi software che ti piace ffmpeg
, sox
o avidemux
.
Ad esempio come lo faccio con ffmpeg
Supponiamo di avere per esempio 2 file con metadati diversi: il
$ diff Original.mp3 Possible-dup.mp3 ; echo $?
Binary files Original.mp3 and Possible-dup.mp3 differ
confronto della forza bruta si lamenta che sono diversi.
Quindi convertiamo e diff body:
$ 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
La parte fuori rotta ; echo $?
è solo a scopo dimostrativo per vedere il codice di ritorno.
Elaborazione di più file (directory trasversali)
Se volete provare duplicati in collezione che hanno la pena di checksum calculate (qualsiasi come crc
, md5
, sha2
, sha256
) di dati e poi basta trovare lì le collisioni.
Sebbene non rientri nell'ambito di tale domanda, suggerirei alcuni semplici suggerimenti su come trovare duplicati di file nella contabilità delle directory solo se contenuti, senza considerare i metadati.
- Prima calcola l'hash dei dati in ogni file (e inseriscilo nel file per la successiva elaborazione): Il
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
file sarà simile a:
$ cat mp3data.hashes
ad48913a11de29ad4639253f2f06d8480b73d48a5f1d0aaa24271c0ba3998d02:file1.mp3
54320b708cea0771a8cf71fac24196a070836376dd83eedd619f247c2ece7480:file2.mp3
1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Original.mp3
8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other-dup.mp3
8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other.mp3
1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Possible-dup.mp3
Qualsiasi RDBMS sarà molto utile lì per aggregare il conteggio e selezionare tali dati. Ma continua la pura soluzione da riga di comando che potresti voler fare come semplici passi.
Vedi eventuali hash duplicati (passaggio aggiuntivo per mostrare come funziona, non necessario per trovare duplicati):
$ count.by.regexp.awk '([0-9a-f]+):' mp3data.hashes
[1:54320b708cea0771a8cf71fac24196a070836376dd83eedd619f247c2ece7480]=1
[1:1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f]=2
[1:ad48913a11de29ad4639253f2f06d8480b73d48a5f1d0aaa24271c0ba3998d02]=1
- E tutti insieme per elencare i file duplicati dal contenuto :
$ 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 è un semplice awk
script per contare i pattern regexp.