4

У меня есть 2 старых похожих дерева каталогов с файлами MP3 в них. Я с радостью использую такие инструменты, как diff и Rsync, чтобы идентифицировать и объединять файлы, которые присутствуют только на одной стороне или идентичны, у меня осталась куча файлов, которые по-разному отличаются.

При запуске diff над парой фактически разных файлов (с тегом -a для принудительного анализа текста) получается непонятный бред. Я слушал файлы с обеих сторон, и они оба, кажется, играют хорошо (но почти по 10 минут на песню, при прослушивании их по два раза, я не сделал много)

Я подозреваю, что различия связаны с тем, что некоторые игроки в прошлом "улучшали" мою коллекцию, возиться с тэгами ID3, но я не уверен. Даже если я укажу различия в тегах ID3, я хотел бы подтвердить, что никакие проблемы с копированием космических лучей или файлов не повредили ни один из файлов.

Один метод, который оказывается, состоит в том, чтобы находить местоположения байтов различий и игнорировать все изменения в первых ~ 10 КБ каждого файла, но я не знаю, как это сделать.

У меня порядка сотни файлов, которые различаются по дереву каталогов.

Я нашел Как сравнить mp3, аудио данные flac в файле, игнорируя данные заголовка (тег ID3) и т.д.? - но я не могу запустить alldup из-за того, что я только Linux, и, судя по всему, это все равно только частично решит мои проблемы.

3 ответа3

1

Вне сравнения по теме?

Beyond Compare 3 не запускается как консольное приложение в Linux. Требуется X-Windows.

ПОДДЕРЖИВАЕМЫЕ РАСПРЕДЕЛЕНИЯ LINUX

Red Hat Enterprise Linux 4-6

Fedora 4-14

Novell Suse Linux Enterprise Desktop 10

openSUSE 10.3-11.2

Ubuntu 6.06-10.10

Debian 5.04

Мандрива 2010

1

Beyond Compare (ссылка выше) выглядит как отличное решение. Я никогда не использовал это. Немного о Xwindows просто означает, что он хочет работать в графическом интерфейсе, а не в командной строке. Если у вас установлен графический интерфейс, то вероятность того, что Xwindows уже правильно установлена в вашей системе, чрезвычайно высока.

Некоторые идеи о том, как поступить:

cmp -i 10kB file1 file2

будет сравнивать два произвольных файла в Linux, сначала пропустив 10 КБ для каждого файла. У него даже есть возможность пропустить различное число байтов в каждом файле. Параметр -b выведет разные байты, но это может быть очень длинный вывод, поэтому, если вы используете его, перенаправьте вывод в файл или в меньший. Вы должны решить, сколько байтов пропустить. Я не знаю этого ответа. Чтобы эффективно использовать его для нескольких файлов, вам нужно написать скрипт на bash или другом языке. Может быть, запуск его как части команды find с опцией exec подойдет.

В будущем, если вы ищете дубликаты файлов, посмотрите fdupes. Это утилита, предназначенная только для этого. Я использовал его, когда все еще пытался понять, как управлять фотографиями на моем компьютере, и у меня получилось множество каталогов с множеством дубликатов в них.

https://code.google.com/p/fdupes/

Кроме того, если вы посмотрите fdupes в википедии, в записи приведен целый ряд программ сравнения файлов Linux.

Просто, черт возьми, я взглянул на:

http://www.id3.org/id3v2.4.0-structure

который определяет структуру тегов id3. Он "рекомендует" размещать теги в начале файла, но также предусматривает добавление дополнительных тегов в конец файла, поэтому, если никто не использует эту опцию, в другом месте файла может быть метаинформация, а не только в начале. Беглый взгляд на спецификацию показывает, что информация тега id3 имеет переменную длину, поэтому не будет точного количества байтов, которое гарантированно пропустит его, но 10k, как первоначально предполагалось, должно быть более чем достаточно для пропуска начальных тегов. ,

0

В качестве возможного решения вы можете использовать любой инструмент для преобразования файла в несжатый поток (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) данных, а затем просто найти там коллизии.

  1. Сначала вычислите хэш данных в каждом файле (и поместите в файл для последующей обработки): 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 Для вашего случая вы можете сравнить только несколько каталогов, например: find -L orig-dir dir-with-duplicates -name '*.mp3' -print0 | while read -r -d $'\0' file; 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 Любой RDBMS будет очень Полезно там агрегировать подсчет и выбирать такие данные. Но продолжайте чистое решение командной строки, вы можете сделать простые шаги, как дальше.

Посмотрите дубликаты хэшей, если таковые имеются (дополнительный шаг, чтобы показать, как это работает, не нужен для поиска дубликатов): $ count.by.regexp.awk '([0-9a-f]+):' mp3data.hashes [1:54320b708cea0771a8cf71fac24196a070836376dd83eedd619f247c2ece7480]=1 [1:1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f]=2 [1:ad48913a11de29ad4639253f2f06d8480b73d48a5f1d0aaa24271c0ba3998d02]=1

  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 скрипт для подсчета шаблонов регулярных выражений.

PS Слегка настроенный вариант https://superuser.com/a/1219353/435801.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .