# [script] début difficile ... find et autre commande.

## ltememe

Bien le bonjour à tous.

je cherche à améliorer un script que j'ai trouvé sur le net, le but étant de le rendre utilisable sur toute une arborescence d'un coup.

le script convertit tous les wma en ogg, en passant par du wav à l'aide de mplayer.

voilà ce que je tente : 

```

#! /bin/bash

find / -name "*.wma" -exec

"

for i in "{}";

   do

   if i="*.wma";

     do

     mplayer -ao pcm -ao pcm:file="${i%.wma}.wav" "$i";

     oggenc -m 128 "$i" "`basename "$i" .wav` .ogg";

     rm "$i".wma;

     rm "$i".wav;

     done;

   fi

   done

"

```

et evidemment ca marche pas ...  :Sad: 

la commande de base, qui marche très bien pour un répertoire est en deux étapes : 

```

Transformation de .wma à .wav:

 for i in *.wma; do mplayer -ao pcm -ao pcm:file="${i%.wma}.wav" "$i"; done 

Transformation de .wav à .ogg:

 for i in *.wav; do oggenc -m 256 "$i" "`basename "$i" .wav` .ogg"; done

```

ps : ca vient de là : http://users.linuxbourg.ch/waver/blog/index.php?2004/11/12/5-convertion-de-wma-en-wav-puis-en-ogg

Merci !

----------

## ultrabug

Bonjour

Pour améliorer ton script, tu devrais selon moi peut-être commencer par améliorer la recherche des fichiers.

Je te conseille d'utiliser slocate, bien plus rapide que find

```
emerge -av slocate
```

Cela te donnera la commande locate

Tu feras donc un simple (si je me souviens bien) :

```
locate /path/de/recherche *.mp3
```

Bonne continuation

----------

## ltememe

oui, j'ai déjà installé locate .. la recherche n'est pas trop un problème.. c'est surtout de passer en paramètre le résultat de la commande qui est complexe pour moi ...

j'ai beau avoir fait du C, php, java..etc ... je sais pas pourquoi, j'arrive pas avec le bash :S

----------

## coco-loco

je pense que tu devrais plutôt procéder de façon suivante:

```
 ls *.wav|while read file

  do

    sox -V "$file" -r 44100 tmp.wav;

    rm "$file"

    mv tmp.wav "$file"

  done

```

J'utilise ce script pour corriger des fichiers wav, il te faudra donc l'adapter, mais cela ne devrait pas présenter de problème je pense.

----------

## scout

Je pense que c'est un problème de guillemets. si j'étais toi, je mettrait tout le for dans un script séparé (parceque là j'ai essayé avec une fonction et ça ne marche pas)

euh sinon pour la boucle for je vois pas trop ce que le if fait à ...

euh sinon là j suis en train de m'amuser à faire le truc simple sans fichiers temporaires ...

----------

## gim

 *ultrabug wrote:*   

> Pour améliorer ton script, tu devrais selon moi peut-être commencer par améliorer la recherche des fichiers.
> 
> Je te conseille d'utiliser slocate, bien plus rapide que find

 

locate n'est pas du tout fait pour ce genre d'utilisation ; qui te dis que l'arborescence à été indexée, où même que celle ci est à jour ?

----------

## ltememe

décidemment, je comprends vraiment rien au script  :Sad: 

je vois bien ce que fait ton ls *.wav, tu le passes en tube pour la suite, mais d'où vient ce "read file" .. j'ai jamais vu ca nullepart  :Sad: 

ca marche avec un locate ou un find ? 

je crois bien qu'après, effectivement, je pourrai l'adapter... merci beaucoup, mais il me reste juste ca à comprendre :p

pour le for : effectivement, je me rend bien compte que c'est peut etre bien très lourd, mais ca doit etre mes vieux réflexes de C qui reviennent à mettre des boucles partout :p (j'ai jamais dit que j'étais un optimisateur de code :p )

la boucle for, je pensais faire un truc du genre "pour chaque fichier trouvé par find, faire la procédure à mettre en wav, mettre en ogg, supprimer le wav et wma, passer au suivant"...c'est tout.

----------

## boozo

la cmd locate et a proscrire car elle est associée une indexation des fichiers (updatedb) généralement couplée à une règle cron et c'est un peu délirant de faire cette indexation manuellement toutes les 10 secondes ; donc passe par find pour ta recherche de fichiers   :Wink: 

et puis pour gagner du temps tu peux restreindre l'arborescence de ta recherche (--> cf. find /home/<user>/<dir_song>)

----------

## gim

Je te conseille ceci:

```
#!/bin/sh

find / -name '*.wma' |

(

while read i

do

   echo "$i"

done

)
```

Où tu remplaces "echo" par ce qu'il faut faire sur le fichier "$i".

----------

## ltememe

message recu... mais ce read file marche quand meme ?

surtout que j'étais en train de regarder, et que je ne voyais pas comment faire un locate sur juste un bout d'arborescence :p (genre que dans /home/yop...)

edit : merci gim, j'essaie tout de suite !  :Smile: 

----------

## gim

Pour info, 'read' est un commande qui lit une ligne sur l'entrée standard, or 'find' renvoie les noms de fichiers qu'il a trouvés sur sa sortie standard chacun sur une ligne. Avec un '|' on arrive à les faire communiquer  :Wink: 

----------

## ltememe

j'avance j'avance ... :p

bon, je commence à un peu mieux capter le principe et j'en suis là : 

```

#! /bin/bash

find $1 -name "*.wma" |

while read i;

   do

     mplayer -ao pcm:file=${i%.wma}.wav $i;

#     oggenc -m 256 "$i" "`basename "$i" .wav` .ogg";

#     rm "$i".wma;

#     rm "$i".wav

   done;

```

évidemment, j'en suis qu'à la première étape : la transformation en .wav.. je me suis pas mal inspiré de http://www.tldp.org/LDP/abs/html/parameter-substitution.html#PSUB2 pour comprendre tout ca...

le problème, c'est que ca marche pas... mplayer se lance bien, mais ne fait rien et sort sans forcément avoir une erreur.

le problème aussi, c'est que ca marche quand je le fais directement en console une fois : mplayer -ao pcm:file=truc.wav test/08_totale_scheisse.wma

et que j'ai l'impression que c'est pareil ....

alors doc ? :p

EDIT : en fait, je me rends compte que ca crée bien le fichier .wav, mais le fichier ne fait que 256Ko ! 

la fin du mplayer me dit : 

```

Joue /home/yop/Desktop/raf/test/09_les_cauchemars.wma

Fichier de type ASF d�ect�

Information sur le clip:

 name: Les cauchemars

 author: forguette mi note

==========================================================================

Ouverture du d�odeur audio: [ffmpeg] FFmpeg/libavcodec audio decoders

AUDIO: 44100 Hz, 2 ch, s16le, 160.0 kbit/11.34% (ratio: 20002->176400)

Selected audio codec: [ffwmav2] afm:ffmpeg (DivX audio v2 (FFmpeg))

==========================================================================

Checking audio filter chain for 44100Hz/2ch/s16le -> 44100Hz/2ch/s16le...

AF_pre: 44100Hz/2ch/s16le

[AO PCM] File: /home/yop/Desktop/raf/test/09_les_cauchemars.wav (WAVE)

PCM: Samplerate: 44100Hz Channels: Stereo Format s16le

[AO PCM] Info: fastest dumping is achieved with -vc dummy -vo null

PCM: Info: to write WAVE files use -waveheader (default).

AO: [pcm] 44100Hz 2ch s16le (2 bps)

Building audio filter chain for 44100Hz/2ch/s16le -> 44100Hz/2ch/s16le...

Vid�: pas de vid�

D�arre la lecture...

[Mixer] No hardware mixing, inserting volume filter.

A:   0.7 (00.7)  0.7% 70%

No bind found for key D

A:   1.1 (01.1)  0.7% 70%

No bind found for key _

No bind found for key _

No bind found for key i

A:   1.5 (01.4)  0.8% 70%

  =====  PAUSE  =====

Sortie... (Fin du fihier)

yop@localhost ~ $

```

Last edited by ltememe on Wed Jan 11, 2006 1:53 pm; edited 1 time in total

----------

## boozo

 *Quote:*   

> mplayer -ao pcm:file=${i%.wma}.wav $i;

 

pour la syntaxe de mplayer je ne sais pas (man mplayer ?) mais là tu sorts quoi q'il arrive donc je penche pour && (si ok alors... mais en cas de pb... donc faut traiter aussi le cas   :Rolling Eyes:  )

----------

## ltememe

heu .. j'ai bien mis le ";"... et si je comprends bien, tu me parles du "&&" pour la suite avec le ogg... mais j'en suis pas encore là :p

pour la syntaxe de mplayer, j'ai effectivement regardé dans la doc (aidé du script que j'avais déjà).

ca marche en console directement, comme je le dis plus haut .. mais pas dans mon script ...  :Sad: 

----------

## boozo

/me va prendre un café en intraveineuse   :Embarassed: 

----------

## ultrabug

 *gim wrote:*   

>  *ultrabug wrote:*   Pour améliorer ton script, tu devrais selon moi peut-être commencer par améliorer la recherche des fichiers.
> 
> Je te conseille d'utiliser slocate, bien plus rapide que find 
> 
> locate n'est pas du tout fait pour ce genre d'utilisation ; qui te dis que l'arborescence à été indexée, où même que celle ci est à jour ?

 

Qui te dit qu'il ne l'est pas ?... Merci du commentaire constructif.

----------

## ltememe

pas la peine de s'engueuler entre find et locate ... disons que je parte sur find, et puis voilà. mon problème ne se trouve pas là, et je pense voir l'avantage de find de toute facon  :Wink: 

yoda (ou plutot boozo), j'ai dit un truc de travers ?  :Sad: 

----------

## boozo

@ ltememe : nan nan c'est ma réponse qui était à côté de la plaque   :Laughing: 

sinon pour la réponse de gim sur find... j'avais précisé sa pensée donc le complément y était pas besoin d'épiloguer... chacun aporte sa pierre si petite soit-elle de façon à avoir une information la plus complête possible   :Wink: 

[Edit] je sais bien que c'est pour la gloire mais je viens de chercher un peu et j'ai trouvé çà (si tu es gnome-like)... la ref.

et doit sûrement en exister d'autres...

----------

## boozo

hooo magnifique... ou comment réinventer la roue --> tiens pour toi public !  :Razz: 

alors moi je dis la fonction Search... y'a que çà d'vrai ! Screugneugneux !  :Twisted Evil: 

----------

## ltememe

merci bien boozo, mais ca marche toujours pas et je me retrouve toujours avec ce fichier de 256Ko ... 

voilà où j'en suis après avoir lu ce que tu m'as donné :

```

#! /bin/bash

# convert .wma files to .ogg

# in the recursive directory in parameter

# Convertit les fichiers .wma en fichier .ogg

# dans les répertoires de l'arborescence du répertoire donné en paramètre (récursif).

#donne la liste des fichier .wma en respectant la casse.

find $1 -iname "*.wma" |

while read i;

   do

#    Convertit les fichiers .wma en fichier .wav

#     mplayer -ao pcm:file=truc.wav test/08_totale_scheisse.wma

     mplayer -ao pcm:file="${i%.wma}.wav" "${i}"

#     Convertit les fichiers .wav en fichiers .ogg

#     oggenc -m 256 "$i" "`basename "$i" .wav` .ogg";

#

#     Suppression des fichiers de transition et des fichiers .wma

#     rm "$i".wma;

#     rm "$i".wav

   done;

```

nom des fichiers : 

```

yop@localhost ~ $ ls /home/yop/Desktop/raf/test/

08_totale_scheisse.wma  09_les_cauchemars.wma

```

et bizarrement, il ne me crée que le fichier 09_les_cauchemars.wav à la suite de ce script... et il fait donc 256Ko (rien pour le morceau 08 ) ...Last edited by ltememe on Wed Jan 11, 2006 4:07 pm; edited 1 time in total

----------

## boozo

heu... j'ai pas de wma pour tester mais chez moi :

```
#!/bin/bash

# mp3 --> ogg

for f in *.mp3 ;

do

mplayer -ao pcm:file="${f/.mp3/.wav}" "${f}"

done
```

 ça marche    :Rolling Eyes: 

----------

## ltememe

hep, tu sais quoi ... ca marche pas :p

(en passant, j'ai évidemment changé les "f" par des "i" et "mp3" par "wma"... )

le résultat est le meme : un fichier créé.

meme fin pour mplayer...  :Sad: 

----------

## boozo

 :Shocked:   bon juste une idée comme çà... wma c'est pas associé au USEflag win32codecs de mplayer ?

----------

## fribadeau

 *ltememe wrote:*   

> 
> 
> ```
> 
> #! /bin/bash
> ...

 

Retire le blanc après le ! en ligne 1 !!!

 :Wink: 

----------

## ltememe

j'ai enlevé le blanc, ca change rien.

effectivement j'ai bien "-win32codecs" dans les paramètres de mplayer dans emerge, et j'aimerai bien croire que ce soit que ca MAIS ca marche très bien quand je le fais en ligne de commande directement avec la commande dite au début ...

----------

## ryo-san

```

#! /bin/bash

# convert .wma files to .ogg

# in the recursive directory in parameter

# Convertit les fichiers .wma en fichier .ogg

# dans les répertoires de l'arborescence du répertoire donné en paramètre (récursif).

#donne la liste des fichier .wma en respectant la casse.

mkfifo $1audiopipe

for i in `find $1 -iname "*.wma"`;do 

     

     name=`echo $i | sed 's/.wma//'`

     oggenc --quiet -q 3 -o $name.ogg $1audiopipe &

     mplayer -vc dummy -vo null -ao pcm:file=$1audiopipe $i

done

rm $1/audiopipe

```

avec $1 = tmp/ sinon faut remplacer les $1audiopipe avec $1/audiopipe

PS : les .wma venant surement de win , rique d'y avoir des soucis avec les noms contenant des espaces

----------

## Oupsman

En créant un script pour convertir un seul fichier, on obtient une solution ultra-modulaire : 

- soit on veut convertir un seul fichier et dans ce cas on appele le script par le nom du fichier en paramètres

- soit on veut convertir tous les fichiers d'une arborescense et on fait :

find $rep -name '*.wma' -exec convert {} ';'

'fin bon moi ce que j'en dis  :Rolling Eyes: 

----------

