Forum Programmation.shell Majuscules et minuscule dans les noms de repertoires

Posté par  .
Étiquettes : aucune
0
11
juin
2011

bonjour :)

c'est la première fois que je viens sur ce forum et j'espère que vous pourrez m'aider
je voudrais renommer des noms de répertoires du type:
toto a la plage.
par
Toto A La Plage
je ne vois qu'une solution:
for toto in $(find . -type d | ls); do
rep=echo -e "${rep}" | sed -r -e 's/(^.| .)/\U&/g'
echo "${rep}" 1111111111

mv "${rep}" "${toto}"

done
mais le résultat de echo me donne
Toto
A
LA
Plage
comment faire pour avoir: Toto A LA Plage sur une seule ligne

merci d'avance

  • # Capitalize

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

    personnellement, je ferais

    mv "$toto" "${(C)toto}"
    

    (c'est du zsh). Et tant qu'à faire du zsh,

    for toto in *(/); do
        mv "$toto" "${(C)toto}"
    done
    
    • [^] # Re: Capitalize

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

      Ce serait bien de tester si le fichier de destination existe avant d'écraser bêtement des données très importantes …

    • [^] # Re: Capitalize

      Posté par  . Évalué à 1.

      Tant qu'à faire du zsh :

      # syntaxe dans le style perl
      for toto (*(/)) {
          mv "$toto" "${(C)toto}"
      }
      

      Ou utiliser les outils fournis par zsh :

      autoload zmv
      zmv -Q "(*)(/)" "${(C)1}"
      
    • [^] # Re: Capitalize

      Posté par  . Évalué à 1.

      Une dernière chose, les guillemets ne sont pas nécessaires dans vos exemples, même si les noms contiennent des espaces, car zsh a une gestion plus saine des types (chaine, tableau de chaines) que sh/bash dans de nombreux cas.

  • # en bash ....

    Posté par  . Évalué à 1.

    ... il faut jouer avec IFS

    OLDIFS=IFS
    IFS=$'\n'
    for toto in *
    do
      [ -d $toto ] &&  {
            rep="`echo  "${toto}" | sed  -r -e  's/(^.| .)/\U&/g'`"
            echo  "${rep}" ;
      };
      done
    IFS=OLDIFS
    

    Les explications

    Pour info, je n'ai pas fait de find car find prend le répertoire courant dans sa liste.

    • [^] # Re: en bash ....

      Posté par  . Évalué à 3.

      Au fait, si c'est pour un TP, essaie de comprendre pourquoi ce que tu as écrit ne fonctionnait pas, et pourquoi ce que je t'ai fourni fonctionne.

      Je t'ai aidé parce que tu avais essayé qqchose, que la ligne SED n'est pas mauvaise, par contre il y a quelques détails qui font que ton bout de code ne fonctionnne pas. Je suis prêt à t'expliquer si tu le veux.

    • [^] # Re: en bash ....

      Posté par  . Évalué à 1.

      Bonjour,

      l'usage de l'IFS n'est ici pas utile.
      en effet, la boucle for n'itère pas sur le résultat d'une commande, mais sur le développement de l'astérisque, qui, lui, échappe les espaces contenus dans les noms de fichiers.

      de plus,
      [ -d "$toto" ] parce que si $toto contient un espace le test va geindre : «opérateur binaire attendu»

      OLDIFS=IFS
      IFS=OLDIFS
      bah, il va être beau l'$IFS !

      • [^] # Re: en bash ....

        Posté par  . Évalué à 2.

        l'usage de l'IFS n'est ici pas utile.
        en effet, la boucle for n'itère pas sur le résultat d'une commande, mais sur le développement de l'astérisque, qui, lui, échappe les espaces contenus dans les noms de fichiers.

        Je ne veux pas être méchant mais ton commetaire me fait penser aux cours d'Anglais à l'école : toujours qqn pour critiquer ceux qui participent, mais pour ce qui est de participer, ben yavait personne.

        La tu idiques que IFS est inutile : peu-être mais chez moi ça marche. Alors la solution n'est peut-être pas idéale, mais elle a le mérite de onctionner. Tu proposes quoi ?

        de plus,
        [ -d "$toto" ] parce que si $toto contient un espace le test va geindre : «opérateur binaire attendu»

        Idem (bien que je sache très bien d'ou vienne le pb, et je ne me suis pas attardé dessus car pas le temps de le faire).

        OLDIFS=IFS
        IFS=OLDIFS
        bah, il va être beau l'$IFS !

        Idem, code écrit assez vite, et j'ai oublié un $. Mais le PI peu brancher aussi son cerveau non ?

        • [^] # Re: en bash ....

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

          J'approuve également l'onction tant qu'elle est donnée par de jeunes filles nubiles.

          pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.

        • [^] # Re: en full bash ...

          Posté par  . Évalué à 1.

          mkdir "toto a la plage"
          (shopt -s nullglob
          for dir in ./*/
          do newDir="${dir%/*}" path="${newDir%/*}" newDir="${newDir##*/}"
          echo "mv "$dir" "$path/$(set -- $newDir; echo "${@^}")""
          done)
          Toto A La Plage

          autre chose ? Je peux... ?

  • # rename

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

    $ rename 's/b(w)/uc$1/ge'

    pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.

    • [^] # Re: rename

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

      $ rename 's/\b(\w)/uc$1/ge'
      

      J'exige le retour de templeet.

      pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.

  • # man tr

    Posté par  . Évalué à -2.

    Hello,

    Une autre solution consiste a utiliser la commande tr:

    echo "Mon Nom De Fichier" | tr [:upper:] [:lower:]

    Dans ton cas, ca doit donner quelque chose comme:

    for toto in $(find . -type d)
    do
    mv "$toto" "$(echo $toto | tr [:upper:] [:lower:])"
    done

    My 2 cents,

    cedric.

Suivre le flux des commentaires

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