Ubuntu et les rm [a-z]*

Le
Alex Ternaute
Bonjour,

J'ai pris l'habitude, pour faire des effacements collectifs dans mes
dossiers de travail, de renommer ce que je veux garder en majuscules, ou
avec juste une majuscule en début de nom.
Jusqu'à présent, je n'avais jamais eu de souci :

$ mkdir toto Toto
$ ls -d [A-Z]*
Toto
$ rm -R [a-z]*
$ ls
Toto

Récemment j'ai reçu une machine neuve avec un Ubuntu préinstallé, et je
fais comme d'habitude, mais là j'efface _tous_ les fichiers et dossiers.
En tâtonnant, je m'aperçois que l'expression [A-Z]* donne la même chose
que [a-z]*.

Est-ce que quelqu'un peut m'indiquer comment rendre les substitutions
sensibles à la casse ?

Un grand merci par avance.
--
Alex
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Nicolas George
Le #26504909
Alex Ternaute , dans le message
Est-ce que quelqu'un peut m'indiquer comment rendre les substitutions
sensibles à la casse ?

Montre-nous la sortie de « locale » sur les deux environnements.
Alex Ternaute
Le #26504913
Bonjour,
Nicolas George a écrit :
Est-ce que quelqu'un peut m'indiquer comment rendre les substitutions
sensibles à la casse ?

Montre-nous la sortie de « locale » sur les deux environnements.

La machine qui différencie la casse :
LANG=en_US
LC_CTYPE="en_US"
LC_NUMERIC="en_US"
LC_TIME="en_US"
LC_COLLATE=C
LC_MONETARY="en_US"
LC_MESSAGES="en_US"
LC_PAPER="en_US"
LC_NAME="en_US"
LC_ADDRESS="en_US"
LC_TELEPHONE="en_US"
LC_MEASUREMENT="en_US"
LC_IDENTIFICATION="en_US"
LC_ALL
la "mauvaise bête" qui ne le fait pas :
LANG=fr_FR.UTF-8
LANGUAGE LC_CTYPE="fr_FR.UTF-8"
LC_NUMERIC="fr_FR.UTF-8"
LC_TIME="fr_FR.UTF-8"
LC_COLLATE="fr_FR.UTF-8"
LC_MONETARY="fr_FR.UTF-8"
LC_MESSAGES="fr_FR.UTF-8"
LC_PAPER="fr_FR.UTF-8"
LC_NAME="fr_FR.UTF-8"
LC_ADDRESS="fr_FR.UTF-8"
LC_TELEPHONE="fr_FR.UTF-8"
LC_MEASUREMENT="fr_FR.UTF-8"
LC_IDENTIFICATION="fr_FR.UTF-8"
LC_ALL
Et une autre qui ignore également la casse :
LANG=fr_FR.UTF-8
LC_CTYPE="fr_FR.UTF-8"
LC_NUMERIC="fr_FR.UTF-8"
LC_TIME="fr_FR.UTF-8"
LC_COLLATE="fr_FR.UTF-8"
LC_MONETARY="fr_FR.UTF-8"
LC_MESSAGES="fr_FR.UTF-8"
LC_PAPER="fr_FR.UTF-8"
LC_NAME="fr_FR.UTF-8"
LC_ADDRESS="fr_FR.UTF-8"
LC_TELEPHONE="fr_FR.UTF-8"
LC_MEASUREMENT="fr_FR.UTF-8"
LC_IDENTIFICATION="fr_FR.UTF-8"
LC_ALL
--
Alex
Benoit Izac
Le #26504912
Bonjour,
Le 10/01/2019 à 18:45, Alex Ternaute a écrit dans le message
J'ai pris l'habitude, pour faire des effacements collectifs dans mes
dossiers de travail, de renommer ce que je veux garder en majuscules, ou
avec juste une majuscule en début de nom.
Jusqu'à présent, je n'avais jamais eu de souci :
$ mkdir toto Toto
$ ls -d [A-Z]*
Toto
$ rm -R [a-z]*
$ ls
Toto
Récemment j'ai reçu une machine neuve avec un Ubuntu préinstallé, et je
fais comme d'habitude, mais là j'efface _tous_ les fichiers et dossiers.
En tâtonnant, je m'aperçois que l'expression [A-Z]* donne la même chose
que [a-z]*.
Est-ce que quelqu'un peut m'indiquer comment rendre les substitutions
sensibles à la casse ?

Je suppose que c'est bash, est-ce que la commande ci-dessous résout le
problème ?
$ shopt -u nocaseglob
--
Benoit Izac
Nicolas George
Le #26504916
Alex Ternaute , dans le message
LC_COLLATE=C
LC_COLLATE="fr_FR.UTF-8"

C'est très probablement lui le coupable.
Personnellement, je conseille de laisser toutes les locales à C/POSIX
sauf les quelques unes qu'on souhaite activement changer. Les locales
sont une invention très mal pensée.
Alex Ternaute
Le #26504986
Bonjour,
Nicolas George :
LC_COLLATE=C

C'est maintenant dans mon .bash_profile
Un grand merci
--
Alex
Alex Ternaute
Le #26504989
Bonjour,
Benoit Izac :
Est-ce que quelqu'un peut m'indiquer comment rendre les substitutions
sensibles à la casse ?

Je suppose que c'est bash, est-ce que la commande ci-dessous résout le
problème ?
$ shopt -u nocaseglob

C'est bien bash, mais la commande n'a pas l'effet escompté ici (elle a
peut-être un effet ailleurs, note).
J'avais vu ce "nocaseglob" dans le man de bash mais pas trouvé (lu en
diagonale) comment le manipuler. Je viens de voir que shopt est largement
utilisé dans le .bashrc par défaut d'Ubuntu, du coup j'apprends
quelquechose.
Merci pour ta réponse.
--
Alex
Jo Engo
Le #26504992
Le Thu, 10 Jan 2019 18:13:02 +0000, Nicolas George a écrit :
LC_COLLATE=C LC_COLLATE="fr_FR.UTF-8"

C'est très probablement lui le coupable.


En effet, pareil pour moi (debian unstable) :
:~/toto$ ls -a
. .. point.point test.sudo titi toto
:~/toto$ echo *
point.point test.sudo titi toto
:~/toto$ touch Beep
:~/toto$ echo [a-z]*
Beep point.point test.sudo titi toto
:~/toto$ locale
../..
LC_COLLATE="fr_FR.UTF-8"
../..
:~/toto$ export LC_COLLATE="C"
:~/toto$ echo [a-z]*
point.point test.sudo titi toto
--
EROS : amour fou
ROSE : don naif
OSER : jusqu au bout
SERO : positif.
-- Droin, René
Benoit Izac
Le #26505080
Bonjour,
Le 11/01/2019 à 10:21, Alex Ternaute a écrit dans le message
Est-ce que quelqu'un peut m'indiquer comment rendre les substitutions
sensibles à la casse ?

Je suppose que c'est bash, est-ce que la commande ci-dessous résout le
problème ?
$ shopt -u nocaseglob

C'est bien bash, mais la commande n'a pas l'effet escompté ici (elle a
peut-être un effet ailleurs, note).
J'avais vu ce "nocaseglob" dans le man de bash mais pas trouvé (lu en
diagonale) comment le manipuler. Je viens de voir que shopt est largement
utilisé dans le .bashrc par défaut d'Ubuntu, du coup j'apprends
quelquechose.

« shopt -u » désactive l'option (u pour unset) ; pour l'activer c'est
« -s » (s pour set).
nocaseglob rend le « pathname expansion » insensible à la case ce qui
correspond au comportement que tu décrivais à un petit détail près ;
« [a-z]* » avec un LC_COLLATE français ne renverra pas les fichiers
commençants par « Z » contrairement à nocaseglob activé.
--
Benoit Izac
Alex Ternaute
Le #26505104
Bobjour,
Benoit Izac :
[ rm ne fait pas de différence entre [A-Z] et [a-z] ]

« shopt -u » désactive l'option (u pour unset) ; pour l'activer c'est
« -s » (s pour set).
nocaseglob rend le « pathname expansion » insensible à la case ce qui
correspond au comportement que tu décrivais à un petit détail près ;
« [a-z]* » avec un LC_COLLATE français ne renverra pas les fichiers
commençants par « Z » contrairement à nocaseglob activé.

Marche pas. Mais pour info, la réciproque fonctionne sur un système qui a
des "US" dans chaque LC :
$ mkdir -p Toto toto
$ ls
Toto/ toto/
$ shopt -s nocaseglob
$ rm -R [a-z]*
$ ls
[nada]
à +
--
Alex
Benoit Izac
Le #26505114
Bonjour,
Le 11/01/2019 à 21:21, Alex Ternaute a écrit dans le message
[ rm ne fait pas de différence entre [A-Z] et [a-z] ]

« shopt -u » désactive l'option (u pour unset) ; pour l'activer c'est
« -s » (s pour set).
nocaseglob rend le « pathname expansion » insensible à la case ce qui
correspond au comportement que tu décrivais à un petit détail près ;
« [a-z]* » avec un LC_COLLATE français ne renverra pas les fichiers
commençants par « Z » contrairement à nocaseglob activé.

Marche pas.

Qu'est ce qui ne marche pas ? Désactiver nocaseglob pour résoudre ton
problème initial ? C'est normal puisqu'il ne venait pas de là mais de
la variable d'environnement LC_COLLATE.
Pour illustrer mes propos précédents :
$ ls
A Z a z
$ ls [a-z]*
a z
$ shopt -s nocaseglob
$ ls [a-z]*
A Z a z
$ shopt -u nocaseglob
$ LC_COLLATE=fr_FR.UTF-8
$ ls [a-z]*
A a z
$ unset LC_COLLATE
$ ls [a-z]*
a z
--
Benoit Izac
Publicité
Poster une réponse
Anonyme