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


58

Je voudrais énumérer 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 effectué une recherche dans la page de manuel relative à la casse, mais je n'ai rien trouvé.

Réponses:


65

Ceci est réellement 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

et ensuite votre commande.

Vous voudrez peut-être mettre cela dans .bashrc, .zshrcou .yashrc, respectivement.

Alternativement, avec zsh:

setopt extendedglob
ls -d -- (#i)*abc*

(c’est-à-dire qu’il n’existe pas de casse globale pour chaque caractère générique)

Avec ksh93:

ls -d -- ~(i:*abc*)

Vous voulez que le globing fonctionne différemment, pas ls, car ce sont tous des fichiers passés lspar le shell.


En bash, comment réinitialiser les paramètres d'origine, si je l'utilise shport -s nocaseglob?
— MTK

6
@ mtk: pour définir une option, vous utilisez shopt -s; pour le désactiver , vous utilisez shopt -u. Vous pouvez envelopper le tout dans un sous - shell en utilisant de ( )sorte que le réglage ne touche pas la coquille mère: (shopt -s nocaseglob ; ls *abc*).
— Ruakh

Donc, il n'y a pas de moyen portable pour cela dans POSIX ou SUS ou quelque chose comme ça (sauf pour [aA][bB][cC])?
— Timothy Gu

Excellente solution, je ne peux pas croire que je n’ai pas rencontré de shoptcommande au cours des 15 dernières années d’utilisation de bash!
— Reza Sanaie

La réponse de Jfg956 est la bonne (la suivante). Pourquoi changer le comportement du shell quand vous avez une expression rationnelle pour ça?
— EnzoR

20

Comme expliqué par polemon, c'est le shell (pas ls) qui s'étend *abc*à une liste de fichiers. Ceci s'appelle la correspondance de modèle .

En plus de changer tout le comportement de correspondance de modèle pour ignorer la casse, vous pouvez utiliser une autre forme de correspondance de modèle que le *. Ce qui suit ferait ce que vous voulez dans bash:

ls *[aA][bB][cC]*

De bash man:

[...] Correspond à l'un des caractères inclus.

Cela permet de faire correspondre à grain plus fin où vous pouvez utiliser *[aA][bB]c*pour correspondre abcou ABcnon abCou ABC. Ou un exemple en français, où je pourrais vouloir faire correspondre toutes les instances du ecaractère:

ls *[eéèêëEÉÈÊË]*

1
Malheureusement, cette approche devient vite lourde à mesure que le modèle s'allonge. Mais pour les choses courtes, ça marche.
— derobert

@derobert: totalement vrai, en particulier (et c'est probablement le cas), le shell a optimisé la casse ignorante correspondante en plaçant tous les noms de fichiers et la demande de correspondance en minuscules avant la comparaison. Cependant, cela [...]peut être utile dans de nombreux cas, et je pensais que cela méritait d'être mentionné.
— Jfg956

1
C'est la bonne réponse. Changer le comportement du shell ne l’est pas.
— EnzoR

Si les paramètres régionaux sont définis correctement, vous devriez pouvoir utiliser des classes d'équivalence [[=e=][=E=]].
— Benjamin W.

8

Vous pouvez également ajouter l' -ioption (--ignore-case) grepà 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

La correspondance des modèles offre de meilleures performances que grep car grep doit tout rassembler, puis filtrer. A une différence notable lorsque vous travaillez avec un dossier plus volumineux.
— Omi

@Omi De plus, les expressions régulières sont pour le texte , en particulier les lignes de texte. Les noms de fichiers peuvent contenir des nouvelles lignes.
— Kusalananda

3

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

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

0

utilisez le code suivant:

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

A quoi sert la variable LC_COLLATE? pouvez-vous expliquer plus loin.
— MTK

cliquez sur le lien pour en savoir plus sur @mtk
— user1678213

0

Vous pouvez GREP utiliser le fichier -iqui ajoute l’option insensible.

Par exemple pour trouver les deux abcet ABCvous 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

5
Luis Perez Je pense que vous n'avez utilisé aucune -ioption dans votre commande.
— Mongrel


-2

Dans tcsh, définissez un alias dans .aliases

alias lsnc "ls BS!* | sort -f "

("BS" = un "backslash"; je devais l'utiliser pour qu'il apparaisse dans mon navigateur.)

et utiliser lsncau lieu dels

En bash, essayez un alias dans .bash_aliases comme

lsnc() { ls $1 | sort -f ; }

Avec des options pour ls, par exemple ls -l, voici une solution simple:

tcsh:

alias lsncl "ls -l BS!* | sort -f -k 9"

frapper:

lsncl() { ls -l $1 | sort -f -k 9 ; }

Êtes-vous sûr de ne pas manquer un ' =' après lsnocase?
— Anthon

Anthon: Les versions (révisée) et lsncl fonctionnent pour moi sous tcsh et bash sur Cygwin et Ubuntu. Notez que pour bash, j'utilise une fonction, pas un "alias" en soi. Lester
— Lester Ingber

Anthon: Oui, vous pouvez probablement utiliser alias dans bash, comme alias lsncl = 'ls -l $ 1 | sort -f -k 9 '
— Lester Ingber

Cette réponse n'aborde pas la question spécifique qui veut que les fichiers transmis à ls soient traités sans distinction de casse. Si le shell passe passe trop peu de fichiers ls, il n'y a rien lset sortpeut peut pour corriger la situation. Comme indiqué dans d'autres réponses, le problème doit être résolu dans le shell, pas avec une lssyntaxe.
— Mark Stosberg
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.