Что-то вызвало повреждение некоторых из моих файлов flac, и чтобы узнать, какие из них мне нужно перезаписать, я бы хотел получить список, содержащий только поврежденные файлы.
Как мне сделать это сейчас: Откройте терминал в каталоге и введите: $ flac -t * .flac
Вывод хороших файлов выглядит примерно так:
Song1.flac: ok
Song2.flac: ok
На некоторых моих старых рипах я получаю предупреждения, но песня вроде бы в порядке:
Song3.flac: WARNING, cannot check MD5 signature since it was unset in the STREAMINFO
Song3.flac: ok
Но когда возникает ошибка, сообщения выглядят примерно так:
Song4.flac: testing, 73% complete
Song4.flac: ERROR while decoding data
state = FLAC__STREAM_DECODER_END_OF_STREAM
Song5.flac: ERROR while decoding data
state = FLAC__STREAM_DECODER_READ_FRAME
Song6.flac: ERROR, MD5 signature mismatch
Song7.flac: *** Got error code 3:FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM
Song7.flac: *** Got error code 0:FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC
Song7.flac: ERROR while decoding data
state = FLAC__STREAM_DECODER_READ_FRAME
The FLAC stream may have been created by a more advanced encoder. Try
metaflac --show-vendor-tag Song7.flac
If the version number is greater than 1.2.1, this decoder is probably
not able to decode the file. If the version number is not, the file
may be corrupted, or you may have found a bug. In this case please
submit a bug report to
http://sourceforge.net/bugs/?func=addbug&group_id=13478
Make sure to use the "Monitor" feature to monitor the bug status.
Мой вопрос is:
Я думаю, что это может быть выполнимо с помощью grep, но я не знаю, как передать вывод команды flac -t в grep. С flac -c
Моя музыкальная коллекция отсортирована по многим подкаталогам и собирается в каждом каталоге и выполнить команду было бы кропотливо.
Бонусные баллы, если он может вывести путь к поврежденному файлу, а не только имя:)
Используя globstar от bash 4, он рекурсивно найдет все файлы flac из текущего каталога и выведет код ошибки и имя файла для файлов с ошибками и предупреждениями.
#!/usr/bin/env bash
shopt -s globstar
for file in ./**/*.flac; do
flac -wst "$file" 2>/dev/null || printf '%3d %s\n' "$?" "$file"
done
Руководство не документирует, с какими кодами ошибок оно выходит для различных типов ошибок, поэтому я добавил код ошибки в вывод, возможно, вы можете увидеть шаблон из него.