web-dev-qa-db-fra.com

Comment faire correspondre les modèles insensibles à la casse avec ls?

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

Remarque

J'ai recherché le cas dans la page de manuel, mais je n'ai rien trouvé.

61
mtk

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.

67
polemon

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ÉÈÊË]*
23
jfg956

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
9
Mongrel

Je ne pense pas que ce soit possible avec ls, mais vous pouvez utiliser find à la place:

find . -maxdepth 1 -iname '*abc*'
4
mat

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
0
Luis Perez

utilisez le code suivant:

LC_COLLATE=en_US ; export LC_COLLATE
ls *abc*
LC_COLLATE=C ; export LC_COLLATE
0
user1678213