Problème avec sed

Fermé
totoche - 5 mai 2016 à 01:51
 totoche - 9 mai 2016 à 06:57
Bonsoir,

je suis nul en informatique et je cherche à faire un programme pour modifier le nom de répertoire. d'après mes recherches j'ai besoin en plus de 2 lignes avec sed.
1: mettre les première lettre de chaque mot en majuscule
2: remplacer les / par des -
voici ou j'en suis:
#!/bin/bash
cd $PWD

ls | while read remplace_; do
#pour mettre la premiere lettre en majuscule
echo "remplace_" | sed 's/^./\u&/'
# pour remplacer Le / par -
`echo ${i} | sed -e s/\\/-/`;
done
ls | while read remplace_; do # remplace les espace par _
mv "$remplace_" "${remplace_// /_}";
done
ls | while read remplace; do # remplace les , par rien
mv "$remplace" "${remplace//,/}";
done
ls | while read remplace; do # remplace les & par And
mv "$remplace" "${remplace//&/And}";
done
ls | while read remplace; do # remplace les ' par rien
mv "$remplace" "${remplace//\'/}";
done
ls | while read remplace; do # remplace les : par rien
mv "$remplace" "${remplace//:/}";
done

merci de vos réponses

3 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 417
5 mai 2016 à 09:05
Salut,

Deux, trois petites choses…

cd ${PWD}
ne sert strictement à rien, puisque
${PWD}
contient la valeur du répertoire courant ;-\

ls | blabla
l'emploi de la commande
ls
est une très mauvaise idée pour filtrer le résultat, ne serait-ce qu'à cause des espaces.

De plus, tu recherches les répertoires (à ce que tu dis), et
ls
retournera tous les fichiers présents dans le répertoire. Pour n'avoir que les répertoires, mieux vaut privilégier la commande
find
et ses options.

Pour le reste, je vois que tu as trouvé les bonnes commandes, que ce soit avec sed ou via l'extension de paramètres du
bash
.
0
merci de me répondre zip31
cd $(PWD) : car mon programme bash est dans /home/prog et que je le lance un peu partout dans mes répertoires
ls : il ni a jamais de fichiers mélangés avec des répertoires, et surtout je n'arrive pas à faire la même chose avec find :(
par contre mes 2 Commande sed ne fonctionnent pas
echo "remplace_" | sed 's/^./\u&/' : ne fait rien
echo ${i} | sed -e `s/\\/-/`:me donne l'aide de sed qui ne m'aide pas :(
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 417
6 mai 2016 à 08:49
Re-
cd $(PWD) : car mon programme bash est dans /home/prog et que je le lance un peu partout dans mes répertoires
Non ! la variable ${PWD} affiche le répertoire courant. Si tu lances ton programme de n'importe où et que ça marche, c'est que ton répertoire (/home/prog) est dans la variable
${PATH}
. Par contre, le programme s'exécute bien dans le répertoire d'où il a été appelé.
ls : il ni a jamais de fichiers mélangés avec des répertoires, et surtout je n'arrive pas à faire la même chose avec find :(
find . -maxdepth 1 -type d
ou 
find /chemin/absolu -maxdepth 1 -type d


t'affichera tout les répertoires (
-type d
) du répertoire courant (
 -maxdepth 1
) empêche de descendre dans les répertoires eux-même)

echo "remplace_" | sed 's/^./\u&/' : ne fait rien
Si si :
$ echo "remplace_" | sed 's/^./\u&/' 
Remplace_

Par contre effectivement, ça ne fait rien concrètement sur un éventuel fichier présent.

echo ${i} | sed -e `s/\\/-/`:me donne l'aide de sed qui ne m'aide pas :(
Parce que c'est des quotes simples ( ' ) qu'il faut mettre autour de l'expression et non des quotes inversées ( ` ) qui servent à interpréter une commande en général à l'intérieur d'une variable ou d'une expression. Mais de nos jours leur utilisation est obsolète, on utilise plutôt
$(commande)
.

Pour que le remplacement ait lieu avec la commande sed, il faut l'utiliser conjointement avec la commande
mv
.

$ ls
remplace les espaces un autre rep un rep a trou

$ for i in *; do mv -v "${i}" "$(sed 's/\<./\u&/g;s/ /_/g' <<< ${i})"; done
«remplace les espaces» -> «Remplace_Les_Espaces»
«un autre rep» -> «Un_Autre_Rep»
«un rep a trou» -> «Un_Rep_A_Trou»

$ ls
Remplace_Les_Espaces Un_Autre_Rep Un_Rep_A_Trou

$
0
totoche > zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021
7 mai 2016 à 06:50
je ne comprend pas :(
j'ai des répertoires du style
toto - 2016/01/21 - blabla pour les remplacer par
toto - 2016-01-21 - blabla

en faisant
for i in *; do
mv -v "${i}" "$(sed 's/\<./\u&/g;s/\//-/g' <<< ${i})";
done
j'ai -> mv: impossible de déplacer «Toto - 2016⁄01⁄21 - & Blabla» vers un sous-répertoire de lui-même,
mais si j'ai toto - 2016 /01/21 - blabla
1 espace disparaît entre 2016 et/01
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 417 > totoche
7 mai 2016 à 09:26
Un des problèmes vient probablement du fait des slashs (/) dans le nom des répertoires. Le slash sous GNU/Linux désigne la racine et par la suite les répertoires qui en découlent.

Apparemment tes répertoires sont des répertoires créés à l'origine sous Windows. Donc à priori, il te faut les renommer sous Windows avec des outils propres à cet OS.
0
merci de me répondre zip31
non, non ils ont été créé sous Debian ou Kubuntu
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 417
8 mai 2016 à 08:20
Montres-moi alors comment tu crées un répertoire avec un slash dans son nom, parce que moi je n'y arrive pas ;-((

$ mkdir -v "toto - 2016/01/21 - blabla" 
mkdir: impossible de créer le répertoire «toto - 2016/01/21 - blabla»: Aucun fichier ou dossier de ce type

$ mkdir -v "toto - 2016\/01\/21 - blabla"
mkdir: impossible de créer le répertoire «toto - 2016\\/01\\/21 - blabla»: Aucun fichier ou dossier de ce type

$ mkdir -v "toto - 2016_01_21 - blabla"
mkdir: création du répertoire «toto - 2016_01_21 - blabla»

$ ls
toto - 2016_01_21 - blabla

$ rename -n 's/_/\//g' * # simulation (-n)
toto - 2016_01_21 - blabla renamed as toto - 2016/01/21 - blabla

$ rename 's/_/\//g' * # sans simulation (-n)
Can't rename toto - 2016_01_21 - blabla toto - 2016/01/21 - blabla: Aucun fichier ou dossier de ce type

$ ls
toto - 2016_01_21 - blabla

$ mv -v toto\ -\ 2016_01_21\ -\ blabla toto\ -\ 2016\/01\/21\ -\ blabla/
mv: impossible de déplacer «toto - 2016_01_21 - blabla» vers «toto - 2016/01/21 - blabla/»: Aucun fichier ou dossier de ce type


Et voila le joli message que j'ai si je veux le faire en graphique :

0
totoche > zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021
8 mai 2016 à 09:03
avec dolphin ou konqueror :)
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 417 > totoche
8 mai 2016 à 09:08
Tu peux nous afficher le contenu de ton répertoire (
ls -l
) ?
0
totoche > zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021
8 mai 2016 à 09:16
une petite partie :)
ls -l
total 348
drwxr-xr-x 2 philippe philippe 4096 mars 21 05:55 Bella Thorne - 2013⁄01⁄08 - Inside - 6th Annual 'Teens for Jeans' Campaign - Palihouse - West Hollywood, California.
drwxr-xr-x 2 philippe philippe 4096 mars 21 05:53 Bella Thorne - 2013⁄01⁄08 - Presentation - 6th Annual 'Teens for Jeans' Campaign - Palihouse - West Hollywood, California.
drwxrwxr-x 2 philippe philippe 4096 mars 20 10:16 Bella Thorne - 2013⁄01⁄29 - Arrives - Premiere Of 'Warm Bodies' - ArcLight Cinerama Dome - Hollywood, California
drwxrwxr-x 2 philippe philippe 4096 mars 20 10:11 Bella Thorne - 2013⁄01⁄29 - Presentation 2 - Premiere Of 'Warm Bodies' - ArcLight Cinerama Dome - Hollywood, California
drwxrwxr-x 2 philippe philippe 4096 mars 20 10:15 Bella Thorne - 2013⁄01⁄29 - Presentation - Premiere Of 'Warm Bodies' - ArcLight Cinerama Dome - Hollywood, California
drwxrwxr-x 2 philippe philippe 4096 mars 21 06:00 Bella Thorne - 2013⁄02⁄02 - Presentation - Premiere Of 'Escape From Planet Earth' - Mann Chinese 6 - Los Angeles, California
drwxrwxr-x 2 philippe philippe 4096 mars 20 10:08 Bella Thorne - 2013⁄02⁄08 - Portrait - 16th Annual 'Friends And Family' pre-GRAMMY event - Paramount Studios - Hollywood, California
drwxrwxr-x 2 philippe philippe 4096 mars 20 10:07 Bella Thorne - 2013⁄02⁄08 - Presentation - 16th Annual 'Friends And Family' pre-GRAMMY event - Paramount Studios - Hollywood, California
drwxrwxr-x 2 philippe philippe 4096 mars 17 13:50 Bella Thorne - 2013⁄02⁄15 - Arrives - 21st Annual Movieguide Awards - Universal Hilton Hotel - Universal City, California
drwxrwxr-x 2 philippe philippe 4096 mars 17 13:50 Bella Thorne - 2013⁄02⁄15 - Presentation - 21st Annual Movieguide Awards - Universal Hilton Hotel - Universal City, California
drwxrwxr-x 2 philippe philippe 4096 mars 17 13:49 Bella Thorne - 2013⁄02⁄15 - Speak Onstage - 21st Annual Movieguide Awards - Universal Hilton Hotel - Universal City, California
drwxrwxr-x 2 philippe philippe 4096 mars 20 10:03 Bella Thorne - 2013⁄03⁄07 - Inside - Joe Fresh at jcp launch event - Joe Fresh at jcp Pop Up - Los Angeles, California
drwxrwxr-x 2 philippe philippe 4096 mars 20 10:04 Bella Thorne - 2013⁄03⁄07 - Presentation - Joe Fresh at jcp launch event - Joe Fresh at jcp Pop Up - Los Angeles, California
drwxrwxr-x 2 philippe philippe 4096 mars 20 09:54 Bella Thorne - 2013⁄03⁄08 - Arrives - 'Dancing With The Stars' - Los Angeles, California
drwxrwxr-x 2 philippe philippe 4096 mars 15 08:08 Bella Thorne - 2013⁄03⁄14 -Premiere Of 'Spring Breakers' - ArcLight Hollywood - Hollywood, California
drwxrwxr-x 2 philippe philippe 4096 mars 20 09:49 Bella Thorne - 2013⁄03⁄19 - Arrives - Premiere Of 'The Host' - ArcLight Cinemas Cinerama Dome - Hollywood, California
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 417 > totoche
8 mai 2016 à 09:22
Ok. Mais c'est toi qui as créé ces répertoires ?
Ou ils sont issus de téléchargement ?
0