Forum Programmation.shell Espaces dans les noms de fichiers

Posté par  (site web personnel) . Licence CC By‑SA.
Étiquettes : aucune
2
1
nov.
2013

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  . É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  . Évalué à 1.

      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 _

      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  (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  . É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  . É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  . Évalué à 1.

    2 solutions simples:

    • utiliser l'option -print0 de find conjointement à xargs -0: Ça devrait donner un truc du genre (à vérifier) bash find /home -name "*.wav" -print0 |xargs -0 -I% lame % %.mp3 -v2
    • lister les fichiers 1 par 1 (1 nom de fichier par ligne) et les traiter avec une boucle (ba)sh du type: 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  (site web personnel) . Évalué à 4. Dernière modification le 02 novembre 2013 à 09:04.

    find . -name '*.wav' | while read i
    do
        echo "$i"
    done
    

    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  (site web personnel) . Évalué à 7.

    Ça, ça ne fonctionne pas ?

    find . -name "*.wav" -exec lame "{}" "{}.mp3" -V2 \;
    
  • # 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 :

    for i in /home/**/*.wav; lame -V2 "$i" "${i/wav/mp3}"
    

    (fonctionne avec zsh. Avec bash v4, ça doit marcher en ajoutant do et done).

    • [^] # Re: for et find

      Posté par  (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  . Évalué à 2.

      (fonctionne avec zsh. Avec bash v4, ça doit marcher en ajoutant do et done).

      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.