Rechercher : dans
Par :

Bash - Remplacer maj par min dans nom de fich

Dernière réponse le 19 aoû 2007 à 08:48:03 artagon7, le 18 aoû 2007 à 21:56:20 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « bash Remplacer maj par min dans nom de fich » dans :
Sed - Introduction à SED - Part III VoirSED - The Stream EDitor - Part III Ce document est une introduction à la pratique et à l'utilisation de l'éditeur de flux "SED", qui essaie de couvrir certaines fonctionnalités assez méconnues, pour ne pas dire "quasi inconnues", qui font de "SED"...
Le remplacement de variables en shell Bash Voir=Le remplacement de variables= Introduction Il peut s'avérer utile de s'assurer qu'une variable est bien définie avant de procéder à son remplacement, ou tout simplement de s'assurer que celle-ci n'est pas vide, et dans ce cas de l'initialiser avec...
Guide d'utilisation du Shell pour débutant VoirSHELL BASH - GUIDE D'UTILISATION - Niveau Débutant Introduction Appel aux membres CCM II. C'est quoi le shell ? III. Comment accéder à la ligne de commande IV. Les consoles virtuelles Exemple : Accéder à la console 3 depuis l'interface...
URL VoirQu'est-ce qu'une URL? Une URL (Uniform Resource Locator) est un format de nommage universel pour désigner une ressource sur Internet. Il s'agit d'une chaîne de caractères ASCII imprimables qui se décompose en cinq parties : Le nom du...
Webmastering - Nom de domaine VoirQu'est-ce qu'un nom de domaine ? Un site internet est défini par son URL. Ainsi, un site hébergé par un hébergeur gratuit (par exemple un fournisseur d'accès à internet) possède généralement une adresse du type : http://www.votre...
VBScript - Les constantes VoirQu'est-ce qu'une constante ? Une constante est un nom, facilement mémorisable, remplaçant une valeur (nombre, chaîne, etc.) qui ne change pas. L'objectif d'une constante est d'une part de permettre de rendre un programme plus lisible, d'autre part...

1

lami20j, le 18 aoû 2007 à 22:41:28

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

Répondre à lami20j

7

artagon7, le 18 aoû 2007 à 23:48:52

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

Répondre à artagon7

8

lami20j, le 18 aoû 2007 à 23:52:08

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 lami20j

Répondre à lami20j

11

artagon7, le 19 aoû 2007 à 00:11:39

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, :)

Répondre à artagon7

2

jipicy, le 18 aoû 2007 à 23:14:50

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
;-))
Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

3

lami20j, le 18 aoû 2007 à 23:20:25

Salut,

je ne connaissais pas shopt ;-)

Merci. lami20j

Répondre à lami20j

4

jipicy, le 18 aoû 2007 à 23:23:47

Tu fais pas assez de shopping c'est pour ça ;-DDDDD

De rien ;-)) Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

5

lami20j, le 18 aoû 2007 à 23:27:40

Tu fais pas assez de shopping c'est pour ça

En effet, moi je fais des ncourses :-DDD lami20j

Répondre à lami20j

6

artagon7, le 18 aoû 2007 à 23:34:34

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

Répondre à artagon7

9

jipicy, le 18 aoû 2007 à 23:52:24

Affiche le résultat de :

shopt
tout court ;-))
Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

10

artagon7, le 19 aoû 2007 à 00:06:15

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, :)

Répondre à artagon7

12

jipicy, le 19 aoû 2007 à 00:40:23

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...
Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

13

artagon7, le 19 aoû 2007 à 01:08:10

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, :-)

Répondre à artagon7

14

jipicy, le 19 aoû 2007 à 01:20:38

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. Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

15

artagon7, le 19 aoû 2007 à 01:39:42

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, :-)

Répondre à artagon7

16

lami20j, le 19 aoû 2007 à 02:03:15

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$
lami20j

Répondre à lami20j

17

lami20j, le 19 aoû 2007 à 02:06:36

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$

lami20j

Répondre à lami20j

18

artagon7, le 19 aoû 2007 à 02:22:36

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.

Répondre à artagon7

19

lami20j, le 19 aoû 2007 à 02:26:38

De rien,

à la prochaine :-)) lami20j

P.S. Je ne sais pas si tu as remarqué mais j'ai fait un p'tit changement
au début j'ai mis
mv "$fich.new" $rep/${nouveau%%.NEW}
en fait c'est
mv "$fich.new" $rep/$nouveau
quoi que le résultat est le même c'est plutôt ça dans la logique :-)

avec ta permission, je mets en résolu

Répondre à lami20j

20

 jipicy, le 19 aoû 2007 à 08:48:03

Merchi auchi ;-))

Bon dimanche à touch.

PS. Comme quoi le "set -xv" devrait être obligatoire et indissociable du "shebang" !!! Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy