OVH Cloud OVH Cloud

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

6 réponses

1 2
Avatar
Lucas Levrel
Le 11 janvier 2019, à 22:55, Benoit Izac a écrit :
« [a-z]* » avec un LC_COLLATE français ne renverra pas les fichiers
commençants par « Z » contrairement à nocaseglob activé.


$ LC_COLLATE=fr_FR.UTF-8
$ ls [a-z]*
A a z

Très fort et surtout très piégeux !
Allez, c'est l'heure de zZzZzZ...
--
LL
Ἕν οἶδα ὅτι οὐδὲν οἶδα (Σωκράτης)
C'est mieux avé les accents (F. Patte)
Avatar
Alex Ternaute
Bonjour,
Benoit Izac :
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 ?

J'ai répondu de manière abrupte, certes. J'essaie maintenant de mieux
décrire ce que fait nocaseglob chez moi.
$ shopt -u nocaseglob
$ LC_COLLATE=fr_FR.UTF-8
$ ls [a-z]*
A a z
$ unset LC_COLLATE
$ ls [a-z]*
a z

Pas forcément, ça dépend aussi des autres variables LC_*
Sur le desktop Ubuntu en tout-UTF-8 :
$ echo $LC_COLLATE
fr_FR.UTF-8
$ shopt -u nocaseglob
$ ls [a-z]*
a A z # en effet
$ unset LC_COLLATE
$ ls [a-z]*
a A z # hélas
Sur un serveur distant avec toutes les LC_* en "C" :
$ LC_COLLATE="fr_FR.UTF-8"
$ shopt -u nocaseglob
$ ls [a-z]*
a z
Je configure un terminal du desktop comme ceux du serveur :
$for LC in $(locale) ; do export $(echo $LC|cut -d = -f 1)=C ; done
et maintenant :
$ LC_COLLATE=fr_FR.UTF-8
$ shopt -u nocaseglob
$ ls [a-z]*
a z
Maintenant je suis mieux outillé pour ce cas de figure, merci.
à +
--
Alex
Avatar
Lucas Levrel
Bonjour,
Le 14 janvier 2019, à 09:26, Alex Ternaute a écrit :
$ shopt -u nocaseglob
$ LC_COLLATE=fr_FR.UTF-8
$ ls [a-z]*
A a z
$ unset LC_COLLATE
$ ls [a-z]*
a z

Pas forcément, ça dépend aussi des autres variables LC_*
Sur le desktop Ubuntu en tout-UTF-8 :
$ echo $LC_COLLATE
fr_FR.UTF-8
$ shopt -u nocaseglob
$ ls [a-z]*
a A z # en effet
$ unset LC_COLLATE
$ ls [a-z]*
a A z # hélas

À mon avis le problème n'est pas d'autres LC_... mais LANG : en l'absence
de valeur dans une LC_..., $LANG est pris à la place. C'est le sens des
guillemets dans la sortie de « locale ».
Sur un serveur distant avec toutes les LC_* en "C" :
$ LC_COLLATE="fr_FR.UTF-8"
$ shopt -u nocaseglob
$ ls [a-z]*
a z
Je configure un terminal du desktop comme ceux du serveur :
$for LC in $(locale) ; do export $(echo $LC|cut -d = -f 1)=C ; done
et maintenant :
$ LC_COLLATE=fr_FR.UTF-8
$ shopt -u nocaseglob
$ ls [a-z]*
a z

Normal, LC_ALL prend le pas sur toute valeur LC_... définie. C'est dit
dans « man 7 locale » (mais pas très clairement).
--
LL
Ἕν οἶδα ὅτι οὐδὲν οἶδα (Σωκράτης)
C'est mieux avé les accents (F. Patte)
Avatar
Jo Engo
Le Fri, 11 Jan 2019 09:06:35 +0000, Alex Ternaute a écrit :
C'est maintenant dans mon .bash_profile

He n'ap pas de ~/.bash_profile j'ai mis LC_COLLATE=C dans mon .bashrc
mais ça risque de ne pas marcher avec les shells de login %)
--
- Dites-moi, Karl, vous avez bu hier toute la monnaie coréenne !
« marx : cuviez wons. »
-- Esposito-Farese, Gilles
Avatar
Olivier Miakinen
Le 18/01/2019 11:41, Jo Engo a [presque] écrit :
C'est maintenant dans mon .bash_profile

[J]e n'a[i] pas de ~/.bash_profile j'ai mis LC_COLLATE=C dans mon .bashrc
mais ça risque de ne pas marcher avec les shells de login %)

Si c'est le cas, il te suffit de créer un .bash_profile qui appelle le
.bashrc, non ?
Dans le nouvellement créé ~/.bash_profile :
if [ -f ~/.bashrc ]; then
source ~/.bashrc
fi
--
Olivier Miakinen
Avatar
Jo Engo
Le Sat, 19 Jan 2019 15:06:43 +0100, Olivier Miakinen a écrit :
Si c'est le cas, il te suffit de créer un .bash_profile qui appelle le
.bashrc, non ?
Dans le nouvellement créé ~/.bash_profile :
if [ -f ~/.bashrc ]; then
source ~/.bashrc
fi

«ça marche chez moi» avec quand même un petit bémol : la casse est
respectée mais LC_COLLATE a une autre valeur. Je vais m'inspirer de ce
que tu proposes mais aussi regarder sjnma /etc/skel/bash_profile d'abord
enfin je crois ;) (pense-bête) au fait toujours faire :
$ echo [a-z]*
et pas
$ rm [a-z]*
--
Boarf, tu sais, pour mon Canon un sac poubelle suffit...

Pierrôt... Chuis choqué la tu vois :)
-+- Daniel, sur fr.rec.photo -+-
1 2