В качестве возможного решения вы можете использовать любой инструмент для преобразования файла в несжатый поток (pcm
, wav
) без информации метаданных, а затем сравнить его. Для конвертации вы можете использовать любое программное обеспечение, например, ffmpeg
, sox
или avidemux
.
Например, как я делаю это с ffmpeg
Скажем, у меня для этого примера 2 файла с разными метаданными:
$ diff Original.mp3 Possible-dup.mp3 ; echo $?
Binary files Original.mp3 and Possible-dup.mp3 differ
Сравнением грубой силы они отличаются.
Затем мы просто конвертируем и переводим тело:
$ 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 $?
часть только для демонстрации, чтобы увидеть код возврата.
Обработка нескольких файлов (перемещение каталогов)
Если вы хотите попробовать дубликаты в коллекции, стоит рассчитать контрольные суммы (любые, например, crc
, md5
, sha2
, sha256
) данных, а затем просто найти там коллизии.
Хотя это выходит за рамки этого вопроса, я бы предложил несколько простых предложений о том, как найти дубликаты файлов в каталоге с учетом только его содержимого без учета метаданных.
- Сначала вычислите хэш данных в каждом файле (и поместите в файл для последующей обработки):
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
файл будет выглядеть так:
$ cat mp3data.hashes
ad48913a11de29ad4639253f2f06d8480b73d48a5f1d0aaa24271c0ba3998d02:file1.mp3
54320b708cea0771a8cf71fac24196a070836376dd83eedd619f247c2ece7480:file2.mp3
1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Original.mp3
8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other-dup.mp3
8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other.mp3
1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Possible-dup.mp3
Любая СУБД будет очень полезна для сбора и выбора таких данных.
Но продолжайте чистое решение командной строки, вы можете сделать простые шаги, как дальше.
Посмотрите дубликаты хэшей, если таковые имеются (дополнительный шаг, чтобы показать, как это работает, не нужен для поиска дубликатов):
$ count.by.regexp.awk '([0-9a-f]+):' mp3data.hashes
[1:54320b708cea0771a8cf71fac24196a070836376dd83eedd619f247c2ece7480]=1
[1:1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f]=2
[1:ad48913a11de29ad4639253f2f06d8480b73d48a5f1d0aaa24271c0ba3998d02]=1
- И все вместе, чтобы вывести список файлов, дублированных по содержанию:$ grep mp3data.hashes -f <(count.by.regexp.awk '([0-9a-f]+):' mp3data.hashes | grep -oP '(?<=\[1:.) {64}(?!]= 1 $) ') | сортировать 1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Original.mp3 1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Possible-dup.mp3 8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other-dup.mp3 8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other.mp3
count.by.regexp.awk - это простой awk
скрипт для подсчета шаблонов регулярных выражений.