Bash - Remplacer maj par min dans nom de fich
Résolu
artagon7
Messages postés
423
Statut
Membre
-
jipicy Messages postés 41342 Statut Modérateur -
jipicy Messages postés 41342 Statut Modérateur -
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
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
A voir également:
- Min en maj
- Maj en min - Guide
- È maj - Guide
- Maj chrome - Accueil - Applications & Logiciels
- Maj windows 10 - Accueil - Mise à jour
- Alt maj - Guide
8 réponses
Salut,
Min => Maj
lami20j
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
CCCMaj => 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
Salut,
Affiche le résultat de la commande :
Affiche le résultat de la commande :
shopt | grep nocaseglobsi 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;-))
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, :)
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, :)
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...
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...
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, :-)
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, :-)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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.
Les fichiers en minuscule n'existent pas au départ ?
Affiche aussi avant le contenu du répertoire "/media/sda5/Informatique/Linux/test/"
Merci.
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, :-)
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, :-)
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$
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, 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.
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.
En passant, dis-moi que je ne suis pas le seul present dans ton repertoire /trash. Ca va me consoler un peu ;-))
Merci
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
Et merci de n'etre pas le seul dans /trash. Ca m'aurait fait quelque chose ... :-(
Merci pour ton aide, :)