¿Cómo hacer coincidir los patrones de mayúsculas y minúsculas con ls?


58

Me gustaría enumerar todos los archivos que coinciden con un cierto patrón mientras se ignora el caso.

Por ejemplo, ejecuto los siguientes comandos:

ls *abc*

Quiero ver todos los archivos que tienen "abc" como parte del nombre del archivo, ignorando el 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

He buscado casos en la página del manual, pero no pude encontrar nada.

Respuestas:


65

En realidad, esto es hecho por su shell, no por ls.

En bash, usarías:

shopt -s nocaseglob

y luego ejecuta tu comando.

O en zsh:

unsetopt CASE_GLOB

O en yash:

set +o case-glob

y luego tu comando.

Es posible que desee poner eso en .bashrc, .zshrco .yashrc, respectivamente.

Alternativamente, con zsh:

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

(es decir, la diferencia entre mayúsculas y minúsculas por comodín)

Con ksh93:

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

Desea que globbing funcione de manera diferente, no ls, ya que esos son todos los archivos pasados lspor el shell.


En bash, ¿cómo restablecer la configuración original, si la uso shport -s nocaseglob?
mtk

66
@mtk: para establecer una opción, usa shopt -s; para desarmarlo , lo usas shopt -u. Alternativamente, se puede envolver todo en un subnivel mediante el uso ( )de modo que el ajuste no afecta a la cáscara de los padres: (shopt -s nocaseglob ; ls *abc*).
ruakh

Entonces, ¿no hay formas portátiles para esto en POSIX o SUS o algo así (excepto [aA][bB][cC])?
Timothy Gu

Excelente solución, ¡no puedo creer que no haya encontrado el shoptcomando en los últimos 15 años de usar bash!
Reza Sanaie

La respuesta de Jfg956 es la correcta (la siguiente). ¿Por qué cambiar el comportamiento del shell cuando tienes una expresión regular para eso?
EnzoR

20

Como explica polemon, es el shell (no ls) que se extiende *abc*a una lista de archivos. Esto se llama coincidencia de patrones .

Además de cambiar todo el comportamiento de Coincidencia de patrones para ignorar mayúsculas y minúsculas, podría usar otra forma de coincidencia de patrones que no sea *. Lo siguiente haría lo que quieras en bash:

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

De bash man:

[...] Coincide con cualquiera de los caracteres incluidos.

Esto permite una mayor coincidencia de grano fino donde podría usar *[aA][bB]c*para hacer coincidir abco ABcno, abCo no ABC. O un ejemplo en francés, donde podría querer unir todas las instancias del epersonaje:

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

1
Desafortunadamente, ese enfoque se vuelve rápidamente difícil de manejar a medida que el patrón se alarga. Pero para las cosas cortas, funciona.
derobert

@derobert: totalmente cierto, especialmente es (y probablemente sea el caso) el shell ha optimizado el caso de ignorar coincidencias al poner todos los nombres de archivo y la solicitud de coincidencia en minúsculas antes de comparar. Sin embargo, [...]puede ser útil en muchos casos, y pensé que valía la pena mencionarlo.
jfg956

1
Esta es la respuesta correcta. Cambiar el comportamiento del shell no lo es.
EnzoR

Si la configuración regional está configurada correctamente, debería poder usar clases de equivalencia [[=e=][=E=]].
Benjamin W.

8

También puede agregar la -iopción (--ignore-case) greppara obtener y la salida a continuación.

[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 coincidencia de patrones tiene un mejor rendimiento en comparación con grep porque grep necesita reunir todo y luego filtrar. Tiene una diferencia notable cuando se trabaja con una carpeta más grande.
Omi

@Omi Además, las expresiones regulares son para texto , específicamente líneas de texto. Los nombres de archivo pueden contener nuevas líneas.
Kusalananda

3

No creo que esto sea posible con ls, pero podría usar find en su lugar:

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

0

usa el siguiente código:

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

¿Para qué es la variable LC_COLLATE? ¿Puedes explicar más?
mtk

haga clic en el enlace para saber sobre esto @mtk
user1678213

0

Puede usar el archivo GREP para -iagregar la opción insensible.

Por ejemplo, para encontrar ambos abcy ABCpuede ejecutar 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

55
Luis Pérez, creo que no has usado la -iopción en ninguna parte de tu comando.
Mestizo


-2

En tcsh, establezca un alias en .aliases

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

("BS" = una "barra invertida"; tuve que usar esto para que aparezca en mi navegador).

y usar en lsnclugar dels

En bash, prueba un alias en .bash_aliases como

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

Con opciones para ls, por ejemplo ls -l, aquí hay una solución simple:

tcsh:

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

golpetazo:

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

¿Estás seguro de que no te falta un ' =' después de lsnocase?
Anthon

Anthon: lsnc y lsncl (revisados) funcionan para mí en tcsh y bash tanto en Cygwin como en Ubuntu. Tenga en cuenta que para bash, estoy usando una función, no un "alias" per se. Lester
Lester Ingber

Anthon: Sí, es probable que pueda usar alias en bash, como alias lsncl = 'ls -l $ 1 | ordenar -f -k 9 '
Lester Ingber

Esta respuesta no aborda la pregunta específica que quiere pasar los archivos pasados ​​a ls para ser tratados como mayúsculas y minúsculas. Si el shell pasa pasa muy pocos archivos a ls, no hay nada lsy sortpuede para solucionar la situación. Como se señaló en otras respuestas, el problema debe resolverse en el shell, no con una lssintaxis.
Mark Stosberg
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.