Jako możliwe rozwiązanie można użyć dowolnego narzędzia do konwersji pliku na nieskompresowany strumień ( pcm
, wav
) bez informacji o metadanych, a następnie porównania. Do konwersji można użyć dowolnego oprogramowania masz jak ffmpeg
, sox
lub avidemux
.
Na przykład, jak to robię z ffmpeg
Powiedzmy, że mam dla tego przykładu 2 pliki z różnymi metadanymi:
$ diff Original.mp3 Possible-dup.mp3 ; echo $?
Binary files Original.mp3 and Possible-dup.mp3 differ
Brute force porównanie skarży się, że są one różne.
Następnie konwertujemy i różnicujemy ciało:
$ 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
; echo $?
Część oczywiście jest tylko w celach demonstracyjnych, aby zobaczyć kod powrotu.
Przetwarzanie wielu plików (katalogów poprzecznych)
Jeśli chcesz spróbować duplikaty w kolekcji mieć wartość do obliczenia sum kontrolnych (każdy jak crc
, md5
, sha2
, sha256
) danych, a następnie po prostu znaleźć tam kolizje.
Chociaż nie mieści się w zakresie tego pytania, sugerowałbym kilka prostych sugestii, jak znaleźć duplikaty plików w katalogu rozliczającym tylko zawartość bez uwzględnienia metadanych.
- Najpierw oblicz sumę danych w każdym pliku (i umieść w pliku do następnego przetwarzania):
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
Plik będzie wyglądał tak:
$ cat mp3data.hashes
ad48913a11de29ad4639253f2f06d8480b73d48a5f1d0aaa24271c0ba3998d02:file1.mp3
54320b708cea0771a8cf71fac24196a070836376dd83eedd619f247c2ece7480:file2.mp3
1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Original.mp3
8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other-dup.mp3
8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other.mp3
1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Possible-dup.mp3
Każdy RDBMS będzie tam bardzo pomocny do agregacji liczby i wybrania takich danych. Ale kontynuuj czyste rozwiązanie wiersza polecenia, możesz wykonać proste kroki, takie jak dalsze.
Zobacz duplikaty skrótów, jeśli takie istnieją (dodatkowy krok, aby pokazać, jak to działa, nie jest potrzebny do znajdowania duplikatów):
$ count.by.regexp.awk '([0-9a-f]+):' mp3data.hashes
[1:54320b708cea0771a8cf71fac24196a070836376dd83eedd619f247c2ece7480]=1
[1:1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f]=2
[1:ad48913a11de29ad4639253f2f06d8480b73d48a5f1d0aaa24271c0ba3998d02]=1
- Wszystko razem, aby wyświetlić listę plików powielonych przez treść :
$ 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 to prosty awk
skrypt do liczenia wzorców wyrażeń regularnych .