Synchronisation arborescence sonothèque
Bonjour,
Pour chaque album que j'achète dans le commerce (2, 3 par mois), je les RIP sur mon PC en FLAC, les disques vont dans la voiture et les FLAC sur mon "NAS" afin d'y avoir accès sur n'importe quel PC sur mon réseau local.
Puis je me suis acheté récemment un baladeur numérique (SanDisk Sansa+) et bien qu'il lise les FLAC je prèfère y mettre un format lossy (OGG dans mon cas) pour économiser de la place.
Je souhaite donc me créer un script shell qui scruterai (via une ligne dans CRON) un répertoire donné en paramètre (la source de mes FLAC) et ira scruté le dossier OGG afin de créerait les OGG manquant à l'ajout de nouveaux FLAC.
Les arborescence sont de ce type :
/mnt/share/music/FLAC/Artiste/Album
/mnt/share/music/OGG/Artiste/Album
Pour info, mon "NAS" est un Pentium IV recycler avec Debian NetInstall et Samba et mon PC principal (Core i7) est sous Fedora LXDE.
J'aimerais approfondir mes connaissances en shell avec se besoin et voici un premier jet "qui marche" :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| #!/bin/bash
listfile() {
#Sauvegarde de L'Internal Field Separator (Utile ???)
SaveIFS=$IFS
#Seprateur uniquement au saut de page
IFS=$'\n'
#Pour tout les fichiers du répertoire donné en paramètre
for fichier in $(eval ls \"$1\"); do
#Si c'est un fichier
if [ -f "$1/$fichier" ]; then
#Si le nom du fichier contient '.flac'
if [ ${fichier##*.} == 'flac' ]; then
#Détermination du nom complet du fichier cible
local fileDest=$(replaceStr "$1/$fichier" "FLAC" "OGG")
local fichier_flac=$1/$fichier
fileDest=$(replaceStr "$fileDest" ".flac" ".ogg")
#Recherche si fichier cible existant
if [ ! -f "$fileDest" ]; then
echo "Compression de : "$fileDest
#On le compresse
oggenc "$fichier_flac" -q9
#On le met dans le repertoire OGG
fichier_ogg=$(replaceStr "$fichier_flac" ".flac" ".ogg")
mv "$fichier_ogg" "$fileDest"
fi
elif [ ${fichier##*.} == 'png' ] || [ ${fichier##*.} == 'jpg' ] || [ ${fichier##*.} == 'txt' ]; then
#Détermination du nom complet du fichier cible
local fileDest=$(replaceStr "$1/$fichier" "FLAC" "OGG")
local fileSrc=$1/$fichier
#Recherche si fichier cible existant
if [ ! -f "$fileDest" ]; then
echo "Copie de : "$fileDest
#On copie le fichier
mv "$fileSrc" "$fileDest"
fi
fi
#Si c'est un répertoire
elif [ -d "$1/$fichier" ]; then
local rep=$1/$fichier
#Détermination du nom du répertoire cible
local repDest=$(replaceStr "$rep" "FLAC" "OGG")
#Si inexitant
if [ ! -d "$repDest" ]; then
echo "___KO : "$repDest
#Création du répertoire
eval mkdir \"$repDest\"
fi
#Appel récursif avec ce nouveau répertoire
listfile "$rep"
fi
done
#On réapplique le IFS sauvegardé (Utile ???)
IFS=$SaveIFS
}
replaceStr(){
local cible=$(echo $1 | sed -e "s/$2/$3/")
echo $cible
}
source=$1
echo $source
listfile "$source" |
C'est un premier jet écrit lors d'une codding night (oui j'ai galéré pour si peu) donc pas très beau mais voyez-vous des horreurs à me faire corriger ?