Ubuntu et les rm [a-z]*

16 réponses
Avatar
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

10 réponses

1 2
Avatar
Nicolas George
Alex Ternaute , dans le message
<5c3784b8$0$21601$, 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.
Avatar
Alex Ternaute
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
Avatar
Benoit Izac
Bonjour,
Le 10/01/2019 à 18:45, Alex Ternaute a écrit dans le message
<5c3784b8$0$21601$ :
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
Avatar
Nicolas George
Alex Ternaute , dans le message
<5c378642$0$21601$, a écrit :
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.
Avatar
Alex Ternaute
Bonjour,
Nicolas George :
LC_COLLATE=C

C'est maintenant dans mon .bash_profile
Un grand merci
--
Alex
Avatar
Alex Ternaute
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
Avatar
Jo Engo
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é
Avatar
Benoit Izac
Bonjour,
Le 11/01/2019 à 10:21, Alex Ternaute a écrit dans le message
<5c38600e$0$3703$ :
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
Avatar
Alex Ternaute
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
Avatar
Benoit Izac
Bonjour,
Le 11/01/2019 à 21:21, Alex Ternaute a écrit dans le message
<5c38fac2$0$5505$ :
[ 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
1 2