#1 Le 09/11/2013, à 10:45
- Crestey
[Résolu] Commande find qui doit lancer un sous-programme
Bonjour à tous,
J'ai fait un petit script pour fusionner de grosses CD-thèques de mes amis avec la mienne.
Dans ce script, je dois faire des traitements pour tous les fichiers mp3 d'un répertoire et de ses sous répertoires.
Pour cela, j'utilise la commande find comme suit (extrait du script) et ça fonctionne à merveille:
# Remplace ? par - dans noms fichiers
echo $(date +%Hh%M)"... remplace ? par - dans fichiers ..."$sp
find "$music"/in -name "*.mp3" -exec ./renomme {} \;
# efface fichiers vides
echo $(date +%Hh%M)"...efface fichiers vides..."$sp
find "$music"/in -name "*.mp3" -exec ./purge0 {} \;
# déplace & renomme mp3
echo $(date +%Hh%M)"...déplace et renomme les mp3..."$sp
find "$music"/in -name "*.mp3" -exec ./mvmp3 {} \;
Ici, "find" execute les scripts renomme, purge, et mvmp3, qui sont chacun dans 3 fichiers différents.
Je souhaite intégrer ces 3 fichiers dans 3 procédures intégrées au programme principal (pour n'avoir qu'un seul fichier), et je n'y parviens pas.
j'ai essayé ça (qui ne marche pas)
purge()
{
# cette procédure déplace les fichiers vides dans le répertoire ....
... commandes appliquées à $1...
}
...
find "$music"/in -name "*.mp3" -exec purge0 {} \;
...
Quelqu'un peut-il m'aiguiller ?
Dernière modification par Crestey (Le 09/11/2013, à 11:27)
Merci à tous.
Sous Ubuntu/XFCE depuis 2013. Ça fonctionne vraiment très bien.
Hors ligne
#2 Le 09/11/2013, à 11:26
- Crestey
Re : [Résolu] Commande find qui doit lancer un sous-programme
J'ai trouvé en farfouillant un peu :
sspr()
{
ls $1
}
export -f sspr
find /home/crestey/essai -name "*.mp3" -exec bash -c 'sspr "{}"' \;
ici le sous programme est sspr. (Il ne fait ici que lister les fichier mp3 de /home/crestey/essai pour l'exemple)
Il me suffit de rajouter tous les traitements de fichier que je souhaite (ajouts suppression de tags, renommage, etc, ...) sur $1 dans sspr et le tour est joué.
A noter que l'ordre importe : écrire le sous programme en premier, puis la commande export, puis la fonction find (avec "bash -c").
A+
Dernière modification par Crestey (Le 09/11/2013, à 12:54)
Merci à tous.
Sous Ubuntu/XFCE depuis 2013. Ça fonctionne vraiment très bien.
Hors ligne
#3 Le 09/11/2013, à 11:45
- tiramiseb
Re : [Résolu] Commande find qui doit lancer un sous-programme
Salut,
L'approche que tu indiques ainsi que la solution me semblent un peu "crado".
Ne peux-tu pas intégrer le "find" dans chacune de tes trois procédures, plutôt que de le garder "à l'extérieur" ?
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#4 Le 09/11/2013, à 12:52
- Crestey
Re : [Résolu] Commande find qui doit lancer un sous-programme
Bonjour tiramised,
Si je peux décradifier, je suis partant. Mais en fait je ne comprends pas bien ce que tu veux dire.
J'ai une procédure qui contient pas mal de traitements à faire sur des fichiers mp3 contenues dans une arborescence de répertoires.
En googolisant, je ne voyais que des find qui exécutaient une seule ou deux actions au plus.
Ma procédure contient 76 lignes (voir fin de ce message, elle est sans doute aussi très décradifiable )
Alors la seule solution que j'avais trouvé était de la mettre dans un fichier séparé (ici mvmp3) et d'écrire la ligne suivante dans le Main
find "$music"/in -name "*.mp3" -exec ./mvmp3 {} \;
Mais en googolisant là, j'ai vu qu'on pouvait intégrer la procédure dans le Main.
Peux-tu préciser où je peux décradifier
A te lire
Voici la procédure (initialement dans un fichier externe, puis intégrée au Main)
#! /bin/bash
ech()
{
echo -e -n "\r________________________________________________________________________________________________"
echo -e -n "\r$1"
}
music="/mnt/d/MusicProcess"
#************Extraction des tag du fichier $1
albumartist="$(mediainfo --Inform="General;%Album/Performer%" "$1")"
artist="$(mediainfo --Inform="General;%Artist%" "$1")"
album="$(mediainfo --Inform="General;%Album%" "$1")"
TrackName="$(mediainfo --Inform="General;%Track%" "$1")"
TrackNum="$(mediainfo --Inform="General;%Track/Position%" "$1")"
BitRate="$(mediainfo --Inform="Audio;%BitRate%" "$1")"
if [ "$TrackNum" != "" ]; then
TrackNum=$( expr $TrackNum - "0" )
fi
TrackNum=$(printf "%02d" $TrackNum)
CdNum="$(mediainfo --Inform="General;%Part/Position%" "$1")"
CdTot="$(mediainfo --Inform="General;%Part/Position_Total%" "$1")"
Cd=""
if [ "$CdNum" != "" ]; then
Cd="_CD$CdNum""|""$CdTot"
fi
#************Remplacement du caractère "/" par "-"
albumartist="$(echo "$albumartist" | sed s/'\/'/'-'/g )"
artist="$(echo "$artist" | sed s/'\/'/'-'/g )"
album="$(echo "$album" | sed s/'\/'/'-'/g )"
TrackName="$(echo "$TrackName" | sed s/'\/'/'-'/g )"
#************Remplacement du caractère "?" par "-"
albumartist="$(echo "$albumartist" | sed s/'\?'/'-'/g )"
artist="$(echo "$artist" | sed s/'\?'/'-'/g )"
album="$(echo "$album" | sed s/'\?'/'-'/g )"
TrackName="$(echo "$TrackName" | sed s/'\?'/'-'/g )"
#************Limitation à 50 caractères*********
gauche=50
albumartist=${albumartist:0:gauche}
artist=${artist:0:gauche}
album=${album:0:gauche}
TrackName=${TrackName:0:gauche}
if [ "$artist" = "" ]; then
artist="inconnu"
mid3v2 "$1" --TPE1 "inconnu"
fi
#************Renommage/Déplacement du fichier
if [ "$album" != "" ]; then
out="/out"
else
out="/pbAlbum"
fi
if [ ! -d "$music$out/artist($albumartist)_album($album)$Cd" ]; then
mkdir "$music$out/artist($albumartist)_album($album)$Cd"
ech "$music$out/artist($albumartist)_album($album)$Cd"
fi
toto="$music$out/artist($albumartist)_album($album)$Cd/"$TrackNum"_artist($artist)_track($TrackName).mp3"
if [ ! -d "$toto" ]; then
mv "$1" "$toto"
else
BitRateToto="$(mediainfo --Inform="Audio;%BitRate%" "$toto")"
if [ BitRatetoto -lt BitRate ]; then
cp "$1" "$toto"
fi
fi
Dernière modification par Crestey (Le 09/11/2013, à 13:00)
Merci à tous.
Sous Ubuntu/XFCE depuis 2013. Ça fonctionne vraiment très bien.
Hors ligne
#5 Le 09/11/2013, à 13:34
- Watael
Re : [Résolu] Commande find qui doit lancer un sous-programme
salut,
Tu pourrais "simplifier" (ou au moins accélérer son exécution) en ne faisant qu'un appel à mediainfo, dont les informations seront lues par une boucle `while', où les variables se verront assigner les données souhaitées avec un `case'.
Quant aux `sed' qui exécutent la même instruction, le développement des paramètres peut le faire.
par exemple :
while read -r data
do
case $data in
Album/Performer*) albumartist="${data##*: }";;
autre) :pareil ;) ;;
esac
done < <(mediainfo "$1")
Dernière modification par Watael (Le 09/11/2013, à 14:25)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#6 Le 09/11/2013, à 13:37
- tiramiseb
Re : [Résolu] Commande find qui doit lancer un sous-programme
Ok, j'avoue que ta procédure est plus velue que ce que j'imaginais
À la limite, il vaut mieux conserver une logique comme tu as fait, car j'ai bien peur que si on essaie d'imbriquer la boucle du "find" dans ce truc-là ça ne devienne encore plus crade qu'actuellement
Par contre, plutôt que de faire trois "find ... -exec", pourquoi ne pas faire plutôt :
find "$music/in" -name "*.mp3" | while read f; do renomme "$f"; purge0 "$f"; mvmp3 "$f"; done
En plus, "export -f" ne fonctionne qu'avec Bash, pas avec un Shell POSIX de base... Là, ça fonctionne avec sh tout court...
Dernière modification par tiramiseb (Le 09/11/2013, à 13:39)
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#7 Le 09/11/2013, à 13:40
- tiramiseb
Re : [Résolu] Commande find qui doit lancer un sous-programme
Ah ben oui, tu peux aussi simplifier le contenu de ta boucle comme l'indique Watael
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#8 Le 09/11/2013, à 13:43
- Crestey
Re : [Résolu] Commande find qui doit lancer un sous-programme
Merci les amis
Merci à tous.
Sous Ubuntu/XFCE depuis 2013. Ça fonctionne vraiment très bien.
Hors ligne