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é.

mtk
la source

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.

polemon
la source
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ÉÈÊË]*
jfg956
la source
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
Bâtard
la source
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*'
tapis
la source
0

utilisez le code suivant:

LC_COLLATE=en_US ; export LC_COLLATE
ls *abc*
LC_COLLATE=C ; export LC_COLLATE
utilisateur1678213
la source
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
Luis Perez
la source
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 ; }
Lester Ingber
la source
Ê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