Mon royaume pour une ligne de commande

Rahhh quoi de meilleur que la ligne de commande ? non, vraiment, quoi de meilleur ?

Ce soir, j'ai enfin décidé de créer toutes les playlists de mes albums sur mon iAudio X5. Ça m'a complètement gavé d'écouter les chansons des albums par ordre alphabétique, au lieu de leur ordre normal. Peu d'importance dans les CD standards... mais dans le cas d'un concert ou d'un BOF, ça change quand même beaucoup de choses. Bref, je me suis mis au boulot. Les playlists de mon PC ne conviennent pas car les chemins sont différents. Du coup, je me suis écrit un petit script que je vous reproduis en intégralité :

#!/bin/sh
# playlist.sh : create a playliste for iAudio X5 player

if test $# -lt 1; then
  echo "Usage : `basename $0` directory"
  echo "ERROR : first argument is missing !"
  exit 1
fi

if test ! -d "$1"; then
  echo "Usage : `basename $0` directory"
  echo "ERROR : first argument is not a directory !"
  exit 2
fi

dir=$1
album=`basename $dir`
singer=`dirname $dir`
singer=`basename $singer`
playlist="${singer}__${album}.m3u"

echo "## Creating playlist '$playlist'"

for myfile in ${dir}/*.ogg
do
  track=`ogginfo $myfile | grep -i tracknumber | awk -F "=" '{ print $2 }'`
  echo "$track $myfile"
done | sort -n | awk -F " " '{ print $2 }' > ${playlist}

Il suffit d'appeler le script playlist.sh avec le répertoire de l'album dont on veut récupérer la playlist. Une fois testé, je l'ai exécuté pour tous mes albums avec cette petite ligne :

find ../music -mindepth 2 -type d | while read rep
do
  playlist.sh $rep
done

Je ne sais pas pourquoi xargs n'a pas voulu aller plus loin que le premier répertoire. Évidemment, ça fait beaucoup de playlists dans un même répertoire. J'ai donc voulu créer un répertoire a pour tous les albums commençant par a, b pour tous ceux commençant par b, etc. Nouvelle petite ligne de commande pour créer les répertoires :

ls | cut -c 1 | sort | uniq | xargs mkdir

Une autre pour déplacer tous les fichiers dont le bon répertoire :

find -type d | sed -e 's/\.\///' | grep -v "\." | while read rep
do
  mv ${rep}?* $rep
done

Le "?*" me permet d'avoir au moins un caractère après ${rep}, ce qui m'évite de déplacer ${rep} dans ${rep}, ce qui n'est pas trop apprécié :) J'ai ensuite compris qu'il me fallait aussi modifier tous les fichiers pour ajouter un "../" de plus dans le chemin de chaque fichier. J'ai été un peu épouvanté à l'idée d'avoir à le faire manuellement mais une simple commande m'a encore sauvé la vie :

find . -type f | while read fichier
do
  mv $fichier ${fichier}.bak
  sed -e 's/^/\.\.\//' ${fichier}.bak > $fichier
done

Bref, la ligne de commande, c'est que du bonheur :-D

Commentaires

1. Le mardi, avril 18 2006, 23:15 par papillon

merci pour les infos :-)

Ajouter un commentaire

Les commentaires peuvent être formatés en utilisant une syntaxe wiki simplifiée.

Fil des commentaires de ce billet