我如何递归检查包含 flac 文件的文件夹是否损坏?

我如何递归检查包含 flac 文件的文件夹是否损坏?

某些原因损坏了我的部分 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.

我的问题是:

  • 如何过滤输出以仅显示带有警告(输出包含警告)或错误(输出包含错误)的文件?

我认为使用 grep 可能可行,但我不知道如何将 flac -t 命令的输出提供给 grep。使用 flac -c

  • 如果可行,我该如何一次检查所有子目录?

我的音乐收藏被分成许多子目录,并且进入每个目录并运行命令会很费力。

如果它能够输出损坏文件的路径,而不仅仅是名称,那就加分了:)

答案1

使用 bash 4 的 globstar,这将递归地从当前目录中查找所有 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

手册没有记录不同类型的错误退出时的错误代码,因此我在输出中添加了错误代码,也许您可​​以从中看到一种模式。

相关内容