web-dev-qa-db-fra.com

Comment puis-je vérifier récursivement les dossiers avec des fichiers flac pour la corruption?

Quelque chose a causé d'endommager certains de mes fichiers flac, et pour savoir lesquels j'ai besoin de ré-extraire, je voudrais obtenir une liste contenant uniquement les fichiers endommagés.

Comment je le fais maintenant: Ouvrez un terminal dans un répertoire et entrez: $ flac -t * .flac

La sortie de bons fichiers est quelque chose comme:

Song1.flac: ok
Song2.flac: ok

Sur certaines de mes vieilles déchirures, je reçois des avertissements, mais la chanson semble aller bien:

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

Mais lorsqu'une erreur se produit, les messages ressemblent à:

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.

Ma question est:

  • Comment puis-je filtrer la sortie pour n'afficher que les fichiers avec des avertissements (la sortie contient AVERTISSEMENT) ou des erreurs (la sortie contient ERREUR)?

Je pense que cela pourrait être faisable avec grep, mais je ne sais pas comment donner la sortie de la commande flac -t à grep. Avec flac -c

  • Et si cela fonctionne, comment puis-je vérifier tous les sous-répertoires à la fois?

Ma collection de musique est triée en plusieurs sous-répertoires et aller dans chaque répertoire et exécuter la commande serait laborieux.

Points bonus s'il pouvait sortir le chemin du fichier corrompu, pas seulement le nom :)

2
shaddow

En utilisant globstar de bash 4, cela trouvera récursivement tous les fichiers flac du répertoire courant, et affichera le code d'erreur et le nom de fichier pour ceux avec des erreurs et des avertissements.

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

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

Le manuel ne documente pas avec quels codes d'erreur il se termine pour différents types d'erreurs, j'ai donc ajouté le code d'erreur dans la sortie, peut-être pouvez-vous en voir un modèle.

2
geirha