Buscar comando: ¿cómo ignorar mayúsculas y minúsculas?


171

Estoy buscando el archivo "WSFY321.c" en una enorme jerarquía de directorios.
Por lo general, usaría GNU find : find . -name "WSFY321.c"
pero no sé el caso, podría ser mayúscula, minúscula o una combinación de ambos.

¿Cuál es la forma más fácil de encontrar este archivo?
¿Hay algo mejor que find . | grep -i "WSFY321.c"?

Respuestas:


216

Las versiones recientes de GNU findtienen una -inamebandera, para búsquedas de nombres que no distinguen entre mayúsculas y minúsculas.

find . -iname "WSFY321.c"

66
Además, dado que está buscando específicamente un archivo, probablemente pueda eliminar otro par de tics con la -type fbandera para que no se moleste en mirar el nombre si el inodo es un directorio. Pero eso es niveles pedantes de optimización ...
— Shadur

Para trabajar con algunas expresiones regulares que puedes hacerfind . -iname \*WSFY321.c\* -type f
— Benj

40

Con GNU find u otras versiones de find que lo tienen:

find . -iname 'WSFY321.c'

Con otras versiones:

find . -name '[Ww][Ss][Ff][Yy]321.[Cc]'

O un compromiso que es más lento pero más fácil de escribir:

find . -name '????321.c' | grep -i '/WSFY[^/]*$'

O en zsh:

print -rl -- **/(#i)WSFY321.c

@Gilles La grepversión solo está filtrando mayúsculas, y no entiendo el '[^ /]' .. (no /)
— Peter.O

@Gilles ¿Cuál es el argumento para usar las comillas simples en el primer caso (nombre de archivo exacto) sobre ninguna cita?
— Bernhard

@ Peter.O No *después /de la versión bash. Me refería grep -i. Utilizo en [^/]*lugar de .*no capturar archivos en directorios cuyo nombre comienza con WSFY.
— Gilles

55
@Bernhard Consistency.
— Gilles

Gracias Gilles: eliminé el comentario anterior con una sintaxis incorrecta y probé la versión enmendada, pero no funciona sin * (por una razón inesperada; al menos para mí). La opción entre mayúsculas y minúsculas ya no funciona: shopt -s extglob nocaseglob globstar; printf '%s\n' **/WSFY321.c... supongo que es por eso que se llama un nocase pegote : sólo funciona en el contexto de un pegote (o eso parece).
— Peter.O

1

Dos soluciones para macOS:

Usando GNU find:

brew install findutils --with-default-names
# restart Terminal
find . -iname 'WSFY321.c'

Usando GNU sed:

brew install gnu-sed --default-names
# restart Terminal
find -name "$(sed 's|\([[:alpha:]]\)|[\U\1\L\1]|g' <<<'WSFY321.c')"

1
En macOS Sierra, la opción -iname está disponible de forma predeterminada.
— ThomasW
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.