Bash - Remplacer maj par min dans nom de fich

Résolu
artagon7 Messages postés 423 Statut Membre -  
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

J'essaie de trouver une commande ou d'ecrire un script qui me permettrait d'enlever toutes les lettres majuscules dans mes noms de fichiers pour les remplacer par des lettres minuscules.

J'ai ecrit un script essentiellement base sur une discussion anterieur qui a lieu dans le forum Linux-Unix
Titre : convertir des noms de fichiers
Auteur : chris
Date : lundi 18 avril 2005 à 11h16:59

Script

rep="/media/sda5/Informatique/Linux/Test"
cd $rep
for fich in *; do
nouveau=$(echo $fich | tr '[:upper:]' '[:lower:]');
mv -T "$fich" "$nouveau";
done


Ca me donne le resultat suivant ;

mv: `Editeur_Sed.rtf' and `editeur_sed.rtf' are the same file
mv: `Guide_LInux.txt' and `guide_linux.txt' are the same file
mv: `Notes_sur_les_Scripts.rtf' and `notes_sur_les_scripts.rtf' are the same file


Donc ca ne fonctionne pas. On s'entend, ce n'est pas le script qui n'est pas bon. C'est mon shell bash qui ne voit pas la difference entre les minuscules et les majuscules. En effet, j'etais dans mon repertoire Linux et j'ai fait cd test et ca m'a deplace dans le repertoire test. Ca, je ne le savais pas.

Mon chemin est maintenant /media/sda5/Informatique/Linux/test au lieu de /media/sda5/Informatique/Linux/Test. Comment faire alors pour changer mes noms de fichiers?

Est-ce qu'il y a une variable d'environnement qui permet de faire la distinction entre les minuscules et les majuscules?

Merci
Configuration: Linux
Konqueror 3.5

8 réponses

  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    Min => Maj
    lami20j@deb:~/trash/artagon$ cat ../../ccm.sh
    #!/bin/bash
    rep="/home/lami20j/trash/artagon"
    
    for fich in $rep/*; do
      nouveau=$(echo ${fich##*/} | tr 'a-z' 'A-Z');
      mv -T "$fich" "$rep/$nouveau";
    done
    lami20j@deb:~/trash/artagon$ pwd
    /home/lami20j/trash/artagon
    lami20j@deb:~/trash/artagon$ ls -1
    aaa
    bbb
    ccc
    lami20j@deb:~/trash/artagon$ sh ../../ccm.sh
    lami20j@deb:~/trash/artagon$ ls -1
    AAA
    BBB
    CCC
    Maj => Min
    lami20j@deb:~/trash/artagon$ cat ../../ccm1.sh
    #!/bin/bash
    rep="/home/lami20j/trash/artagon"
    
    for fich in $rep/*; do
      nouveau=$(echo ${fich##*/} | tr 'A-Z' 'a-z');
      mv -T "$fich" "$rep/$nouveau";
    done
    lami20j@deb:~/trash/artagon$ ls -1
    AAA
    BBB
    CCC
    lami20j@deb:~/trash/artagon$ sh ../../ccm1.sh
    lami20j@deb:~/trash/artagon$ ls -1
    aaa
    bbb
    ccc
    lami20j@deb:~/trash/artagon$
    --
    lami20j
    2
    1. artagon7 Messages postés 423 Statut Membre 7
       
      Je viens d'essayer to script lami20j et c'est le meme probleme que j'obtiens. Ton script est bon mais le bash considere les minuscules egales aux majuscules.

      En passant, dis-moi que je ne suis pas le seul present dans ton repertoire /trash. Ca va me consoler un peu ;-))

      Merci
      0
      1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571 > artagon7 Messages postés 423 Statut Membre
         
        le bash considere les minuscules egales aux majuscules.

        regarde ici bash remplacer maj par min dans nom de fich#2

        dis-moi que je ne suis pas le seul present dans ton repertoire /trash.

        tout le CCM est dans mon répertoire trash. Oulà je serai banni :-DDDD
        0
      2. artagon7 Messages postés 423 Statut Membre 7 > lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention  
         
        Oui, lami20j j'ai regarde la note de jipicy.
        Et merci de n'etre pas le seul dans /trash. Ca m'aurait fait quelque chose ... :-(

        Merci pour ton aide, :)
        0
  2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    Affiche le résultat de la commande :
    shopt | grep nocaseglob
    si l'option est à "on" c'est que ton bash ne fait pas la différence entre les majuscules et les minuscules lors du développement des noms de fichiers. Il faudra alors basculer cet été à "off" :
    shopt -u nocaseglob
    ;-))
    0
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      Salut,

      je ne connaissais pas shopt ;-)

      Merci.
      0
      1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention  
         
        Tu fais pas assez de shopping c'est pour ça ;-DDDDD

        De rien ;-))
        0
      2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571 > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Tu fais pas assez de shopping c'est pour ça

        En effet, moi je fais des ncourses :-DDD
        0
    2. artagon7 Messages postés 423 Statut Membre 7
       
      J'ai fait ta commande jipicy et ca me donne

      $ shopt | grep nocaseglob
      nocaseglob off

      Donc, selon ce que tu as ecrit mon bash devrait faire la difference entre les min et les maj ...

      Merci
      0
  3. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Affiche le résultat de :
    shopt
    tout court ;-))
    0
    1. artagon7 Messages postés 423 Statut Membre 7
       
      Voici le resultat de $shopt :

      cdable_vars off
      cdspell off
      checkhash off
      checkwinsize on
      cmdhist on
      dotglob off
      execfail off
      expand_aliases on
      extdebug off
      extglob on
      extquote on
      failglob off
      force_fignore on
      gnu_errfmt off
      histappend off
      histreedit off
      histverify off
      hostcomplete off
      huponexit off
      interactive_comments on
      lithist off
      login_shell off
      mailwarn off
      no_empty_cmd_completion off
      nocaseglob off
      nocasematch off
      nullglob off
      progcomp on
      promptvars on
      restricted_shell off
      shift_verbose off
      sourcepath on
      xpg_echo off


      merci, :)
      0
  4. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Bon ben là je sèche ;-\

    Passe ton shell en mode débugage "set -xv" ("set -" pour repasser en mode normal), relance la commande "cd test" (ou cd Test) et enfin ton script et affiche-nous le résultat que l'on essaie de voir comment ton shell interprète les variables et les noms de fichiers...
    0
    1. artagon7 Messages postés 423 Statut Membre 7
       
      Tel que demande jipicy

      Jacques@Mach_1:/media/sda5/Informatique/Linux$ cd test
      cd test
      + cd test
      echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD/$HOME/~}\007"
      ++ echo -ne '\033]0;Jacques@Mach_1: /media/sda5/Informatique/Linux/test\007'
      Jacques@Mach_1:/media/sda5/Informatique/Linux/test$


      $bash maj_a_min.sh
      bash maj_a_min.sh
      + bash maj_a_min.sh
      mv: `/media/sda5/Informatique/Linux/Test/Editeur_Sed.rtf' and `/media/sda5/Informatique/Linux/Test/editeur_sed.rtf' are the same file
      mv: `/media/sda5/Informatique/Linux/Test/Guide_LInux.txt' and `/media/sda5/Informatique/Linux/Test/guide_linux.txt' are the same file
      mv: `/media/sda5/Informatique/Linux/Test/Notes_sur_les_Scripts.rtf' and `/media/sda5/Informatique/Linux/Test/notes_sur_les_scripts.rtf' are the same file
      echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD/$HOME/~}\007"
      ++ echo -ne '\033]0;Jacques@Mach_1: /media/sda5/Programmes/Scripts\007'
      Jacques@Mach_1:/media/sda5/Programmes/Scripts$

      Merci, :-)
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Euh... pardon, mets ausii le "set -xv" au début de ton script (en dessous de la ligne "shebang" (#! /bin/bash)

    Les fichiers en minuscule n'existent pas au départ ?

    Affiche aussi avant le contenu du répertoire "/media/sda5/Informatique/Linux/test/"

    Merci.
    0
    1. artagon7 Messages postés 423 Statut Membre 7
       
      Salut jipicy

      Dans le repertoire /Test il n'y a que trois fichiers qui contiennent tous au moins une majuscule. Mais il se peut qu'il existe des fichiers qui ne contiennent que des minuscules la ou je vais appliquer dans le futur le script que j'essaie d'ecrire.


      Mon script

      set -xv

      rep="/media/sda5/Informatique/Linux/Test"
      cd $rep
      ls -l

      for fich in $rep/*; do
      nouveau=$(echo ${fich##*/} | tr 'A-Z' 'a-z');
      mv -T "$fich" "$rep/$nouveau";
      done


      Resultat

      $ bash maj_a_min.sh
      bash maj_a_min.sh
      + bash maj_a_min.sh

      rep="/media/sda5/Informatique/Linux/Test"
      + rep=/media/sda5/Informatique/Linux/Test
      cd $rep
      + cd /media/sda5/Informatique/Linux/Test
      ls -l
      + ls -l
      total 144
      -rwxrwx--- 1 root plugdev 4608 2007-08-18 18:52 Editeur_Sed.rtf
      -rwxrwx--- 1 root plugdev 102912 2007-08-18 18:52 Guide_LInux.txt
      -rwxrwx--- 1 root plugdev 2 2007-08-18 18:52 Notes_sur_les_Scripts.rtf

      for fich in $rep/*; do
      nouveau=$(echo ${fich##*/} | tr 'A-Z' 'a-z');
      mv -T "$fich" "$rep/$nouveau";
      done
      + for fich in '$rep/*'
      echo ${fich##*/} | tr 'A-Z' 'a-z'
      ++ echo Editeur_Sed.rtf
      ++ tr A-Z a-z
      + nouveau=editeur_sed.rtf
      + mv -T /media/sda5/Informatique/Linux/Test/Editeur_Sed.rtf /media/sda5/Informatique/Linux/Test/editeur_sed.rtf
      mv: `/media/sda5/Informatique/Linux/Test/Editeur_Sed.rtf' and `/media/sda5/Informatique/Linux/Test/editeur_sed.rtf' are the same file
      + for fich in '$rep/*'
      echo ${fich##*/} | tr 'A-Z' 'a-z'
      ++ echo Guide_LInux.txt
      ++ tr A-Z a-z
      + nouveau=guide_linux.txt
      + mv -T /media/sda5/Informatique/Linux/Test/Guide_LInux.txt /media/sda5/Informatique/Linux/Test/guide_linux.txt
      mv: `/media/sda5/Informatique/Linux/Test/Guide_LInux.txt' and `/media/sda5/Informatique/Linux/Test/guide_linux.txt' are the same file
      + for fich in '$rep/*'
      echo ${fich##*/} | tr 'A-Z' 'a-z'
      ++ echo Notes_sur_les_Scripts.rtf
      ++ tr A-Z a-z
      + nouveau=notes_sur_les_scripts.rtf
      + mv -T /media/sda5/Informatique/Linux/Test/Notes_sur_les_Scripts.rtf /media/sda5/Informatique/Linux/Test/notes_sur_les_scripts.rtf
      mv: `/media/sda5/Informatique/Linux/Test/Notes_sur_les_Scripts.rtf' and `/media/sda5/Informatique/Linux/Test/notes_sur_les_scripts.rtf' are the same file
      echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD/$HOME/~}\007"
      ++ echo -ne '\033]0;Jacques@Mach_1: /media/sda5/Programmes/Scripts\007'
      Jacques@Mach_1:/media/sda5/Programmes/Scripts$

      Merci, :-)
      0
  7. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    et si tu fait comme ça
    lami20j@deb:~/trash/artagon$ cat ../../ccm.sh
    #!/bin/bash
    rep="/home/lami20j/trash/artagon"
    
    for fich in $rep/*; do
      mv "$fich" "$fich.new"
      nouveau=$(echo ${fich##*/} | tr 'A-Z' 'a-z');
      mv "$fich.new" $rep/$nouveau
    done
    lami20j@deb:~/trash/artagon$ ls -1
    Editeur_sed.rtf
    Guide_linux.txt
    Notes_sur_les_scripts.rtf
    lami20j@deb:~/trash/artagon$ sh ../../ccm.sh
    lami20j@deb:~/trash/artagon$ ls -1
    editeur_sed.rtf
    guide_linux.txt
    notes_sur_les_scripts.rtf
    lami20j@deb:~/trash/artagon$
    
    0
  8. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    exécuter avec -vx
    lami20j@deb:~/trash/artagon$ sh -vx ../../ccm.sh
    #!/bin/bash
    rep="/home/lami20j/trash/artagon"
    + rep=/home/lami20j/trash/artagon
    
    for fich in $rep/*; do
      mv "$fich" "$fich.new"
      nouveau=$(echo ${fich##*/} | tr 'A-Z' 'a-z');
      mv "$fich.new" $rep/${nouveau%%.new}
    done
    + for fich in '$rep/*'
    + mv /home/lami20j/trash/artagon/Editeur_sed.rtf /home/lami20j/trash/artagon/Editeur_sed.rtf.new
    echo ${fich##*/} | tr 'A-Z' 'a-z'
    ++ echo Editeur_sed.rtf
    ++ tr A-Z a-z
    + nouveau=editeur_sed.rtf
    + mv /home/lami20j/trash/artagon/Editeur_sed.rtf.new /home/lami20j/trash/artagon/editeur_sed.rtf
    + for fich in '$rep/*'
    + mv /home/lami20j/trash/artagon/Guide_linux.txt /home/lami20j/trash/artagon/Guide_linux.txt.new
    echo ${fich##*/} | tr 'A-Z' 'a-z'
    ++ echo Guide_linux.txt
    ++ tr A-Z a-z
    + nouveau=guide_linux.txt
    + mv /home/lami20j/trash/artagon/Guide_linux.txt.new /home/lami20j/trash/artagon/guide_linux.txt
    + for fich in '$rep/*'
    + mv /home/lami20j/trash/artagon/Notes_sur_les_scripts.rtf /home/lami20j/trash/artagon/Notes_sur_les_scripts.rtf.new
    echo ${fich##*/} | tr 'A-Z' 'a-z'
    ++ echo Notes_sur_les_scripts.rtf
    ++ tr A-Z a-z
    + nouveau=notes_sur_les_scripts.rtf
    + mv /home/lami20j/trash/artagon/Notes_sur_les_scripts.rtf.new /home/lami20j/trash/artagon/notes_sur_les_scripts.rtf
    lami20j@deb:~/trash/artagon$
    
    
    0
    1. artagon7 Messages postés 423 Statut Membre 7
       
      lami20j, tu viens de viser en plein dans le mille. BOUM!

      J'avais cru au debut que ce probleme etait facilement resolvable. Certaines fois, il ne faut pas se fier aux apparences...

      MERCI BEAUCOUP A VOUS DEUX (en majuscules svp :-)) jipicy et lami20j pour votre aide. Un autre probleme que vous resolvez.
      0
  9. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    de rien,

    à la prochaine :-))
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Merchi auchi ;-))

      Bon dimanche à touch.

      PS. Comme quoi le "set -xv" devrait être obligatoire et indissociable du "shebang" !!!
      0