Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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" ?

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 roll )
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 , 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 smile

À 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 big_smile

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)

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 smile

Hors ligne

#8 Le 09/11/2013, à 13:43

Crestey

Re : [Résolu] Commande find qui doit lancer un sous-programme

Merci les amis smile


Merci à tous.
Sous Ubuntu/XFCE depuis 2013. Ça fonctionne vraiment très bien.

Hors ligne