Forum Astuces.divers Remplacer les espaces blanches dans les noms de fichier d'une arborescence par des underscores

Posté par  .
Étiquettes : aucune
0
13
déc.
2010
Bonjour,

je voudrai remplacer les espaces blanches d'une arborescence par des underscores de manière systématique. Je pense utiliser d'abord find pour localiser les noms de fichier, puis utiliser ce script pour renommer le fichier.

Par contre, je ne sais pas comment trouver l'expression régulière signifiant « chaîne de caractère avec au moins un espace » et l'utiliser avec find. Merci beaucoup.
  • # Espace

    Posté par  (site web personnel) . Évalué à 6.

    Avec find ? Eh bien, -name "* *", tout simplement…
  • # utiliser autre chose

    Posté par  . Évalué à 4.

    rename par exemple est fait pour ca
  • # Fait

    Posté par  . Évalué à 2.

    Bon, trouver tous les noms de fichier contenant une espace est assez simple. Il suffit de faire
    find ./ -type f -name *' '* -exec r_space.sh '{}' ';'
    avec r_space.sh qui est

    #! /bin/bash

    # Removes spaces in filenames (replaces them with underscore)
    # Thu, 18 Oct 2007 21:34:45 -0400

    for file in "${1}";
    do
    echo Converting "$file" to "${file// /_}"
    mv "$file" "${file// /_}"
    done

    Merci beaucoup.

    Systemd, the bright side of linux, toward a better user experience and on the road to massive adoption of linux for the desktop.

    • [^] # Encore plus simple

      Posté par  . Évalué à 7.


      find . -execdir rename 's/ /_/g' {} +


      Eventuellement ajouter l'option -n à rename pour éviter une bêtise.
    • [^] # Re: Fait

      Posté par  . Évalué à 2.

      ah ben, non :)
      find ./ -type f -name "* *" -exec r_space.sh {} +

      r_space.sh :#! /bin/bash
      echo "fichiers trouvés : $@"
      for file
      do echo Converting "$file" to "${file// /_}"
      mv "$file" "${file// /_}"
      done
      \; retourne les fichiers un à un, donc itérer avec une boucle for n'est pas utile
      + retourne tous les fichiers trouvés d'un coup
      • [^] # Re: Fait

        Posté par  . Évalué à 2.

        Pour faire la synthèse de tout ça, et se passer de rename pour être portable, on peut faire :

        find . -iname '* *' | while read i ; do echo mv $i ${i// /_} ; done
        • [^] # Re: Fait

          Posté par  (site web personnel) . Évalué à 2.

          -name plutôt que -iname. Ça prend plus de temps d'être insensible à la casse, et pour chercher des espaces ça ne sert à rien, les espaces minuscules et les espaces capitaux étant les mêmes.
          • [^] # Re: Fait

            Posté par  . Évalué à 1.

            Oui. Pardon.

            C'est une vieille habitude et un oubli au moment de la recopie.
        • [^] # Re: Fait

          Posté par  (site web personnel) . Évalué à 2.

          Ta substitution n'est pas portable, c'est du pur Bash, pas du shell générique. La seule façon d'être portable, c'est "$(echo "$i" | sed -e "s/ /_/g")".
          • [^] # Re: Fait

            Posté par  . Évalué à 2.

            En êtes vous sûr ? Parce que c'est effectivement la technique que j'ai utilisé dans mes débuts, mais maintenant je fais beaucoup de « bashitude » (pardon pour le néologisme), je me demande si j'ai tort. En fait, bash est bien pratique, c'est vrai, vis à vis des autres shells, et en particulier quand on n'utilise que celui là :p .

            Systemd, the bright side of linux, toward a better user experience and on the road to massive adoption of linux for the desktop.

            • [^] # Re: Fait

              Posté par  . Évalué à 2.

              En êtes vous sûr ?
              Oui.

              Parce que c'est effectivement la technique que j'ai utilisé dans mes débuts, mais maintenant je fais beaucoup de « bashitude » (pardon pour le néologisme), je me demande si j'ai tort.

              Ça dépend.
              Si tu es sûr que tu disposeras toujours de bash pas de problème.
              Sinon, il faut faire attention.
              Quand Debian a remplacé bash par dash (plus léger) comme shell par défaut au démarrage, il y a eu des surprises :(
              • [^] # Re: Fait

                Posté par  . Évalué à 2.

                Sinon, il faut faire attention.
                Quand Debian a remplacé bash par dash (plus léger) comme shell par défaut au démarrage, il y a eu des surprises :(


                Je pense en effet qu'écrire du code shell portable est bien meilleur. Ça peut être plus compliqué, mais on ne sait jamais sur quel shell on va tomber (expérience vécue). De plus ça évite également de devoir ré-apprendre le manuel du nouveau shell à disposition…

                Systemd, the bright side of linux, toward a better user experience and on the road to massive adoption of linux for the desktop.

                • [^] # Re: Fait

                  Posté par  . Évalué à 2.

                  Ça peut être plus compliqué
                  Ça dépend pour qui.
                  Moi, j'ai appris le shell dans les années 80 (donc Bourne shell, le vrai).
                  Il est probablement moins efficace que bash mais je n'ai jamais été bloqué (avec sed, grep, awk et compagnie, on s'en sort toujours).
                  C'est quand je tombe sur des scripts spécifiques Bash que je dois lire la doc :(.
  • # Detox

    Posté par  . Évalué à 2.

    Tu peux aussi regarder du côté de detox, il fait plus que ça mais il doit y avoir moyen de le configurer.

    « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.