Como combinar padrões insensíveis a maiúsculas e minúsculas com ls?

50

Eu gostaria de listar todos os arquivos que correspondem a um determinado padrão, ignorando o caso.

Por exemplo, eu corro os seguintes comandos:

ls *abc*

Eu quero ver todos os arquivos que têm "abc" como parte do nome do arquivo, ignorando o caso, como

-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

Nota

Eu procurei na página de manual pelo caso, mas não consegui encontrar nada.

    
por mtk 21.09.2012 / 09:13

7 respostas

60

Isso realmente é feito pelo seu shell, não pelo ls .

Em bash , você usaria:

shopt -s nocaseglob

e então executam o seu comando.

Ou em zsh :

unsetopt CASE_GLOB

Ou no yash:

set +o case-glob

e depois o seu comando.

Você pode querer colocar isso em .bashrc , .zshrc ou .yashrc , respectivamente.

Como alternativa, com zsh:

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

(isto é, globalização insensível a maiúsculas e minúsculas por caractere curinga)

Com ksh93:

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

Você deseja que globbing funcione de forma diferente, não ls , pois todos esses arquivos são passados para ls pelo shell.

    
por 21.09.2012 / 09:20
17

Conforme explicado por polemon, é o shell (não ls) que estende *abc* para uma lista de arquivos. Isso é chamado de Correspondência de Padrões .

Além de alterar todo o comportamento da Correspondência de Padrões para ignorar maiúsculas e minúsculas, você poderia usar outra forma de correspondência de padrões do que a * . O seguinte faria o que você quer no bash:

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

Do bash man:

[...] Matches any one of the enclosed characters.

Isso permite uma correspondência mais refinada, em que você pode usar *[aA][bB]c* para corresponder a abc ou ABc , mas não abC ou ABC . Ou um exemplo em francês, onde eu poderia querer corresponder todas as instâncias do caractere e :

ls *[eéèêëEÉÈÊË]*
    
por 21.09.2012 / 17:11
6

Você também pode adicionar a opção -i (--ignore-case) a grep para obter e a saída abaixo.

[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
    
por 25.02.2016 / 16:14
3

Eu não acho que isso é possível com o ls, mas você poderia usar o find:

find . -maxdepth 1 -iname '*abc*'
    
por 21.09.2012 / 09:18
0

use o seguinte código:

LC_COLLATE=en_US ; export LC_COLLATE
ls *abc*
LC_COLLATE=C ; export LC_COLLATE
    
por 19.10.2012 / 20:39
0

Você pode GREP o arquivo usando -i , que adiciona a opção insensível.

Por exemplo, para encontrar os dois abc e ABC , você pode executar este comando

    [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
    
por 25.02.2016 / 16:06
-2

No tcsh, defina um alias em .aliases

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

("BS" = uma "barra invertida"; eu tive que usar isso para que ele aparecesse no meu navegador).

e use lsnc em vez de ls

No bash, tente um alias em .bash_aliases como

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

Com opções para ls , por exemplo, ls -l , veja uma correção simples:

tcsh:

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

bash:

lsncl() { ls -l $1 | sort -f -k 9 ; }
    
por 29.08.2013 / 22:47