Substitution de caractères ... !

Fermé
touchepasaugrisbi Messages postés 75 Date d'inscription vendredi 25 avril 2008 Statut Membre Dernière intervention 15 juin 2008 - 25 avril 2008 à 11:52
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 - 25 avril 2008 à 20:09
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 !!!
            
                
A voir également:

2 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 896
25 avril 2008 à 13:14
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
touchepasaugrisbi Messages postés 75 Date d'inscription vendredi 25 avril 2008 Statut Membre Dernière intervention 15 juin 2008 4
25 avril 2008 à 15:53
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 896
25 avril 2008 à 20:09
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