Como posso recursivamente verificar pastas com arquivos flac por corrupção?

2

Algo causado para danificar alguns dos meus arquivos flac e para descobrir quais eu preciso fazer, eu gostaria de obter uma lista contendo apenas os arquivos danificados.

Como faço agora: abra um terminal em um diretório e digite: $ flac -t * .flac

A saída de arquivos bons é algo como:

Song1.flac: ok
Song2.flac: ok

Em alguns dos meus antigos rasgos eu recebo avisos, mas a música parece estar bem:

Song3.flac: WARNING, cannot check MD5 signature since it was unset in the STREAMINFO
Song3.flac: ok 

Mas quando ocorre um erro, as mensagens são algo como:

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.

Minha pergunta é:

  • Como posso filtrar a saída para mostrar apenas arquivos com avisos (a saída contém AVISO) ou erros (a saída contém ERRO)?

Eu acho que pode ser factível com o grep, mas eu não sei como dar a saída do comando flac -t para grep. Com flac -c

  • E se isso funcionar, como posso verificar todos os subdiretórios de uma só vez?

Minha coleção de músicas é classificada em muitos subdiretórios e indo para todos os dir e executar o comando seria trabalhoso.

Pontos de bônus se ele puder mostrar o caminho do arquivo corrompido, não apenas o nome:)

    
por shaddow 23.07.2012 / 20:01

1 resposta

2

Usando o globstar do bash 4, ele localizará recursivamente todos os arquivos flac do diretório atual e exibirá o código de erro e o nome do arquivo para aqueles com erros e avisos.

#!/usr/bin/env bash
shopt -s globstar

for file in ./**/*.flac; do
    flac -wst "$file" 2>/dev/null || printf '%3d %s\n' "$?" "$file"
done

O manual não documenta com que códigos de erro ele sai para diferentes tipos de erros, portanto, adicionei o código de erro na saída, talvez você possa ver um padrão a partir dele.

    
por geirha 23.07.2012 / 21:23