Bonjour à tous,
C'est sûrement une question de noob mais j'ai eu du mal à trouver une réponse ailleurs.
J'ai un plusieurs répertoires de fichiers Wav à encoder en Mp3 (lame fichier.wav fichier.mp3).
Je me suis dit qu'un script m'aiderait bien, du genre :
for i in `find /home -name "*.wav"`; do lame $i $i.mp3 -V2; done
Avec cette méthode, les espaces ne sont pas bien gérés (ici je me contente d'un echo) :
for i in `find /home -name "*.wav"`; do echo $i; done
le répertoire Rock Français est affiché :
./Rock
Français
donc deux itérations différentes dans le for.
J'ai essayé avec les "" et les {} mais je suis un peu perdu …
Merci d'avance.
# simplifie toi la vie
Posté par NeoX . Évalué à 2.
vu que tu ne fais qu'une seule action tu dois pouvoir tout faire dans le find
find /home -iname '*.wav' -exec lame options1 options2 {} \;
il doit quand meme falloir jouer de quelques options sur lame pour qu'il sorte le fichier en mp3 sans lui redonner le nom du fichier
sinon j'ai tendance à garder mes reflexes de vieux rootard, pas d'accent et pas d'espace dans les noms de dossiers/fichiers.
donc remplacer les espaces par des _
en deux temps,
1) sur les dossiers
find /home -type d -exec rename 's/ /_/g' {} \;
2) sur les fichiers avec
find /home -type f -exec rename 's/ /_/g' {} \;
[^] # Re: simplifie toi la vie
Posté par ne . Évalué à 1.
C'est vrai. Pour autant, c'est bien aussi de comprendre le soucis et de savoir le traiter pour savoir écrire un shell qui ne va pas être utilisé que sur sa propre machine.
[^] # Re: simplifie toi la vie
Posté par Adminrezo (site web personnel) . Évalué à 1.
Oui d'autant plus que d'expliquer à la personne qui partage mon PC qu'il ne faut pas de caractères spéciaux dans les noms, c'est compliqué ;-)
[^] # Re: simplifie toi la vie
Posté par NeoX . Évalué à 2.
c'est vrai que c'est difficile de dire à une personne qu'il ne faut pas d'espace et de caracteres accentues sinon les scripts ne marchent pas et qu'elle devra faire les manips toutes seules à la main.
[^] # Re: simplifie toi la vie
Posté par JGO . Évalué à 3.
Personnellement quand on me dit qu'un truc ne s'ouvre pas, je demande en premier lieu si le fichier a des espaces et si oui, les enlever (comme un hotliner qui demande à « redémarrer l'ordinateur » en step 1). Une fois ma collègue a passé 2 jours à tout essayer pour ouvrir un fichier avant de me demander de l'aide, et mes premiers mots « enlève les espaces dans le répertoire/fichier » ont résolu son problème. Elle s'est juré qu'on ne l'y prendrait plus.
# Spa facile les espaces
Posté par ne . Évalué à 1.
2 solutions simples:
bash find /home -name "*.wav" -print0 |xargs -0 -I% lame % %.mp3 -v2
bash find /home -name "*.wav" -ls |while read i; do lame $i $i.mp3 -V2; done
Il y a d'autres solutions (commer jouer avec IFS), mais fais un peu de recherche sur le web, je pense que le sujet a du être traité au moins 1M fois ^
# tu peux t'en sortir avec while
Posté par JoeltheLion (site web personnel) . Évalué à 4. Dernière modification le 02 novembre 2013 à 09:04.
Il y a aussi une abomination nommée "IFS" qui permet de s'en sortir dans certains cas.
Mais de la part de quelqu'un qui a fait beaucoup de shell: quand on commence à galérer avec les espaces, autant passer à un langage plus rigoureux comme python.
# Tout simplement...
Posté par Sébastien Maccagnoni (site web personnel) . Évalué à 7.
Ça, ça ne fonctionne pas ?
[^] # Re: Tout simplement...
Posté par Adminrezo (site web personnel) . Évalué à 1.
Si, ça marche !
[^] # Re: Tout simplement...
Posté par NeoX . Évalué à 3.
un oneliner, merci seb
je ne savais pas (j'avais jamais testé) qu'on pouvait utiliser 2 fois le {}
# for et find
Posté par 태 (site web personnel) . Évalué à 2.
Comme signalé au dessus, tu as un find et un for, ce qui fait deux boucles, soit une de trop. Et comme le find sort des chaînes contenant des espaces, le for coupe où il peut. Comme les précédents commentaires ont préféré enlever le for, je propose la version sans find :
(fonctionne avec zsh. Avec bash v4, ça doit marcher en ajoutant do et done).
[^] # Re: for et find
Posté par Adminrezo (site web personnel) . Évalué à 1.
C'est compliqué de virer le find car il a l'avantage d'être récursif, non ?
[^] # Re: for et find
Posté par 태 (site web personnel) . Évalué à 2.
Non ce n'est pas compliqué de virer le find : le
**
le remplace avantageusement.[^] # Re: for et find
Posté par NeoX . Évalué à 2.
ca doit marcher avec bash, tout simplement parce que tu n'as qu'une seule commande dans la boucle.
[^] # Re: for et find
Posté par 태 (site web personnel) . Évalué à 2.
J'ai essayé avec bash avant de dire ça. Avec do et done, ça marche, sans il me dit
bash: syntax error near unexpected token `echo'
. (GNU bash, version 4.2.45(1)-release (x86_64-pc-linux-gnu))Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.