Je voudrais répertorier tous les fichiers correspondant à un certain modèle tout en ignorant le cas.
Par exemple, j'exécute les commandes suivantes:
ls *abc*
Je veux voir tous les fichiers qui ont "abc" dans le nom du fichier, en ignorant le cas, comme
-rw-r--r-- 1 mtk mtk 0 Sep 21 08:12 file1abc.txt
-rw-r--r-- 1 mtk mtk 0 Sep 21 08:12 file2ABC.txt
J'ai recherché le cas dans la page de manuel, mais je n'ai rien trouvé.
Cela se fait en fait par votre Shell, pas par ls
.
Dans bash
, vous utiliseriez:
shopt -s nocaseglob
et puis exécutez votre commande.
Ou dans zsh
:
unsetopt CASE_GLOB
Ou en yash:
set +o case-glob
puis votre commande.
Vous voudrez peut-être mettre cela dans .bashrc
, .zshrc
ou .yashrc
, respectivement.
Alternativement, avec zsh:
setopt extendedglob
ls -d -- (#i)*abc*
(c'est-à-dire un remplacement insensible à la casse sur une base par caractère générique)
Avec ksh93:
ls -d -- ~(i:*abc*)
Vous voulez que globbing fonctionne différemment, pas ls
, car ce sont tous les fichiers passés à ls
par le Shell.
Comme expliqué par polemon, c'est le Shell (pas ls) qui étend *abc*
à une liste de fichiers. Cela s'appelle Pattern Matching.
Mis à part le fait de modifier le comportement de correspondance de motifs dans son ensemble pour ignorer la casse, vous pouvez utiliser une autre forme de correspondance de motifs que *
. Ce qui suit ferait ce que vous voulez dans bash:
ls *[aA][bB][cC]*
De l'homme bash:
[...] Correspond à l'un des caractères inclus.
Cela permet une correspondance plus fine des grains où vous pouvez utiliser *[aA][bB]c*
pour correspondre à abc
ou ABc
mais pas abC
ou ABC
. Ou un exemple en français, où je pourrais vouloir faire correspondre toutes les instances du caractère e
:
ls *[eéèêëEÉÈÊË]*
Vous pouvez également ajouter -i
(--ignore-case) option à grep
pour obtenir et la sortie ci-dessous.
[root@localhost ~]# ls -l | grep -i abc
-rw-r--r-- 1 root root 0 Feb 25 20:41 fileabc.txt
-rw-r--r-- 1 root root 0 Feb 25 20:41 fileABC.txt
Je ne pense pas que ce soit possible avec ls, mais vous pouvez utiliser find à la place:
find . -maxdepth 1 -iname '*abc*'
Vous pouvez GREP le fichier en utilisant -i
qui ajoute l'option insensible.
Par exemple, pour trouver à la fois abc
et ABC
, vous pouvez exécuter cette commande
[root@mtk bin]# ls -l | grep -i abc
640K -rw-r--r-- 1 mtk mtk 639K Sep 21 08:12 file1abc.txt
676K -rw-r--r-- 1 mtk mtk 674K Sep 21 08:12 file2ABC.txt
utilisez le code suivant:
LC_COLLATE=en_US ; export LC_COLLATE
ls *abc*
LC_COLLATE=C ; export LC_COLLATE