Substitution de caractères ... !

Bonjour aux linuxiens,

Je cherche à substituer le caractère ' ' (space) par '_' (underscore) dans des noms de fichier et de répertoire (en parcourant une arborescence descendante)...

Voici mon script :

#############
remplace() {
     for z in $(ls)
     do
          if test -d $z
          then
               rep=`echo "$z" | sed 'y/ /_/'`; mv ${z} $rep; cd $rep; remplace; cd ..
          else
               nom=`echo "$z" | sed 'y/ /_/'`; mv ${z} $nom
          fi
     done
}

remplace
#############


Le parcours de l'arborescence se déroule correctement. Par contre, rien sur la substitution...

Quelqu'un(e) a une idée ?

Merci d'avance et bonne journée !!!
Configuration: Linux
Firefox 2.0.0.14

2 réponses

  1. Modérateur
    Salut,

    Tiens voilà une solution vite fait et à adapter :
    # arborescence
    
    [tmpfs]$ tree
    .
    |-- mon rep1
    |   |-- mon fichier1.txt
    |   |-- mon fichier2.txt
    |   |-- mon fichier3.txt
    |   |-- mon fichier4.txt
    |   `-- mon fichier5.txt
    |-- mon rep2
    |   |-- mon fichier1.txt
    |   |-- mon fichier2.txt
    |   |-- mon fichier3.txt
    |   |-- mon fichier4.txt
    |   `-- mon fichier5.txt
    `-- mon rep3
        |-- mon fichier1.txt
        |-- mon fichier2.txt
        |-- mon fichier3.txt
        |-- mon fichier4.txt
        `-- mon fichier5.txt
    
    3 directories, 15 files
    
    # on s'occupe d'abord de substituer les espaces contenus dans les répertoires 
    
    [tmpfs]$ find . -type d -name "*" -exec bash -c 'name=${1};final=${1/ /_}; mv "${name}" "${final}"' - {} \; 2>/dev/null
    [tmpfs]$ tree
    .
    |-- mon_rep1
    |   |-- mon fichier1.txt
    |   |-- mon fichier2.txt
    |   |-- mon fichier3.txt
    |   |-- mon fichier4.txt
    |   `-- mon fichier5.txt
    |-- mon_rep2
    |   |-- mon fichier1.txt
    |   |-- mon fichier2.txt
    |   |-- mon fichier3.txt
    |   |-- mon fichier4.txt
    |   `-- mon fichier5.txt
    `-- mon_rep3
        |-- mon fichier1.txt
        |-- mon fichier2.txt
        |-- mon fichier3.txt
        |-- mon fichier4.txt
        `-- mon fichier5.txt
    
    3 directories, 15 files
    
    # Maintenant on s'occupe des fichiers
    
    [tmpfs]$ find . -type f -exec bash -c 'name=$(basename "$1"); rep=$(dirname "$1"); final=${name/ /_}; mv "${1}" "${rep}/${final}"' - {} \; 2>/dev/null
    [tmpfs]$ tree
    .
    |-- mon_rep1
    |   |-- mon_fichier1.txt
    |   |-- mon_fichier2.txt
    |   |-- mon_fichier3.txt
    |   |-- mon_fichier4.txt
    |   `-- mon_fichier5.txt
    |-- mon_rep2
    |   |-- mon_fichier1.txt
    |   |-- mon_fichier2.txt
    |   |-- mon_fichier3.txt
    |   |-- mon_fichier4.txt
    |   `-- mon_fichier5.txt
    `-- mon_rep3
        |-- mon_fichier1.txt
        |-- mon_fichier2.txt
        |-- mon_fichier3.txt
        |-- mon_fichier4.txt
        `-- mon_fichier5.txt
    
    3 directories, 15 files
    [tmpfs]$ 
    ;-))

    PS. Si il y a plus d'un espace dans les noms de fichiers ou de répertoires, changer la syntaxe de :
    final=${name/ /_}
    par :
    final=${name// /_}
    1. Merci pour tes suggestions jipici !

      Ci-après le script final ;

      #!/bin/bash
      ###
      #
      # Remplace le caractères espace ' ' par le caractère underscore '_'
      # Permet un parcours descendant de l'arborescence
      #
      ###
      
      #
      # Remplace les espaces dans les noms de répertoire
      #
      # Un espace 
      oneSpaceInDirectory() {
      	find . -type d -name "*" -exec bash -c 'name=${1};final=${1/ /_}; mv "${name}" "${final}"' - {} \; 2>/dev/null
      }
      # Plusieurs espaces
      moreOneSpaceInDirectory() {
      	find . -type d -name "*" -exec bash -c 'name=${1};final=${1// /_}; mv "${name}" "${final}"' - {} \; 2>/dev/null
      }
      
      #
      # Remplace les espaces dans les noms de fichier
      #
      # Un espace 
      oneSpaceInFile() {
      	find . -type f -exec bash -c 'name=$(basename "$1"); rep=$(dirname "$1"); final=${name/ /_}; mv "${1}" "${rep}/${final}"' - {} \; 2>/dev/null
      }
      # Plusieurs espaces
      moreOneSpaceInFile() {
      	find . -type f -exec bash -c 'name=$(basename "$1"); rep=$(dirname "$1"); final=${name// /_}; mv "${1}" "${rep}/${final}"' - {} \; 2>/dev/null
      }
      
      
      remplaceSpaceInDirectory() {
      	moreOneSpaceInDirectory
      	for z in $(ls)
      	do
      		if test -d $z
      		then
      			cd $z; remplaceSpaceInDirectory; cd ..
      		fi
      	done
      }
      
      remplaceSpaceInFile() {
      	oneSpaceInFile
      	for z in $(ls)
      	do
      		if test -d $z
      		then
      			cd $z; remplaceSpaceInFile; cd ..
      		fi
      	done
      }
      
      remplaceSpaceInDirectory
      remplaceSpaceInFile
      


      1. Modérateur
        Cool, merci ;-))

        Par contre, pas la peine de faire 2 fonctions à chaque fois, une seule suffit avec la syntaxe traitant plusieurs espaces, elle traitera tout aussi bien, un seul espace que plusieurs ,-))