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.