[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: recherche doublons audio



Bernard Schoenacker a écrit :
Le Tue, 21 Feb 2012 18:31:02 +0100,
Nicolas Roudninski <nicoroud@gmail.com> a écrit :

Bonjour,

Je dispose d'un serveur ovh sous debian sur lequel je stocke ma
musique. Cette musique est organisée en dossiers et sous dossier du
genre : /home/audio/artiste/album/
J'ai des doublons du type : fichier_audio.mp3 / fichier_audio.flac
Je voudrais rechercher ces doublons pour effacer les mp3 quand le même
fichier existe en flac.

J'ai du mal à trouver une solution en googleisant...

Donc si vous avez une piste, je suis preneur

Cordialement,

PS : j'aime bien Perl ;-)

Je pense qu'une solution possible en bash serait celle-ci:

1) lister récursivement tous les fichiers potentiellement "doublons"
(les non-flac, si j'ai bien compris), soit les fichiers  d'extension
mp3, mp4, m4a, etc.  Avec find par exemple, on écrit la liste dans dans
des noms des fichiers sans leur chemins:

  cd /home/audio/
find . -iname "*.mp3" -or -iname "*.m4a" | xargs -L 1 basename > /tmp/allnames.txt

(find à compléter avec les extensions souhaitées)


2) faire la même liste avec les chemins:

  cd /home/audio/
  find . -iname "*.mp3" -or -iname "*.m4a" > /tmp/allpaths.txt

(find à compléter avec les extensions souhaitées)


3) on les regroupe pour former un index (qui sert aussi de cache) de la
forme: nom_fichier<TAB>chemin_complet

  paste /tmp/allnames.txt /tmp/allpaths.txt > /tmp/index.txt


4) pour chaque flac, on recherche si un doublon existe:

  find . -iname "*.flac" -exec bash -c _ _rmdup "{}" \;

Avec _rmdup, la fonction bash ci-dessous


 5) Au final, on a les deux fonctions suivantes et deux commandes
à placer dans le fichier rmdup:

------------------8<------------------
#!/bin/bash


function _rmdup () {
  echo " + searching duplicate of ${1}" 1>&2
  pattern="$(basename "${1}" .flac)"
grep "\/${pattern}\." /tmp/index.txt | cut -d"$(echo -en "\t")" -f 2 | xargs -L 1 -i echo "{}"
  echo "" 1>&2
}
export -f _rmdup

function _initindex () {
find . -iname "*.mp3" -or -iname "*.m4a" | xargs -L 1 -i basename "{}" > /tmp/allnames.txt
  find . -iname "*.mp3" -or -iname "*.m4a" > /tmp/allpaths.txt
  paste /tmp/allnames.txt /tmp/allpaths.txt > /tmp/index.txt
}

_initindex
find . -iname "*.flac" -exec bash -c '_rmdup "${1}"' _ "{}" \;

------------------8<------------------


Exemple sous le shell bash avec une arborescence arbitraire:

  $ cd /home/audio
  $ find
  .
  ./a
  ./a/b
  ./a/b/c
  ./a/b/c/b.mp3
  ./a/b/c/1 2.m4a
  ./a/b/c/1 2.mp3
  ./a/b/b.flac
  ./a/b/b.mp3
  ./a/b/1 2.flac
  ./a/a.flac
  ./a/a.mp3
  ./a/1 2.mp3

  $ ./rmdup
   + searching duplicate of ./a/b/b.flac
  ./a/b/c/b.mp3
  ./a/b/b.mp3

   + searching duplicate of ./a/b/1 2.flac
  ./a/b/c/1 2.m4a
  ./a/b/c/1 2.mp3
  ./a/1 2.mp3

   + searching duplicate of ./a/a.flac
  ./a/a.mp3

Si tout est bon, tu remplaces echo "{}" par rm "{}" dans la dernière
ligne de la fonction _rmdup et tu la relances.  Comme tu le vois, les
noms fichiers contenant des espaces sont correctement pris en charge.

Par contre, si tes fichiers sont mal nommés ou encore que deux artistes
ont des chansons avec le même titre et leurs fichiers respectifs le même
nommage... ouch!  Tu pourrais donc prendre le temps de vérifier la liste
générée avec la version echo "{}" et pourquoi pas faire une copie avec
hardlinks:

  $ cd /home
  $ cp -rl audio/ save_audio

avant de supprimer les doublons.  Que tu pourras supprimer longtemps
après, si tu te rends compte que tout est bon.

Nicolas


Reply to: