Substitution de caractères ... !

touchepasaugrisbi Messages postés 76 Date d'inscription   Statut Membre -  
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   -
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. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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
  2. touchepasaugrisbi Messages postés 76 Date d'inscription   Statut Membre 4
     
    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
    


    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      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 ,-))
      0