Localizar comando: como ignorar maiúsculas e minúsculas?

170

Estou procurando pelo arquivo "WSFY321.c" em uma enorme hierarquia de diretórios.
Normalmente eu usaria o GNU find : find . -name "WSFY321.c"
Mas não sei o caso, pode ser maiúsculo, minúsculo ou uma mistura de ambos.

Qual é a maneira mais fácil de encontrar esse arquivo?
Existe algo melhor do que find . | grep -i "WSFY321.c"?

Nicolas Raoul
fonte

Respostas:

214

As versões recentes do GNU findtêm um -inamesinalizador para pesquisas de nome que não diferenciam maiúsculas de minúsculas.

find . -iname "WSFY321.c"
Lars Rohrbach
fonte
6
Além disso, como você está procurando especificamente um arquivo, provavelmente pode remover outros marcadores com o -type fsinalizador, para não incomodar olhar o nome se o inode for um diretório. Mas isso é níveis pedantes de otimização ...
Shadur
Para trabalhar com alguns regex que você pode fazerfind . -iname \*WSFY321.c\* -type f
Benj
40

Com o GNU find, ou outras versões do find que o possuem:

find . -iname 'WSFY321.c'

Com outras versões:

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

Ou um compromisso mais lento, mas fácil de digitar:

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

Ou no zsh:

print -rl -- **/(#i)WSFY321.c
Gilles
fonte
@Gilles A grepversão é a filtragem único caso superior, e eu não entendo o '[^ /]' .. (não /)
Peter.O
@Gilles Qual é o argumento para usar aspas simples no primeiro caso (nome do arquivo exato), sem aspas?
Bernhard
@ Peter.O Não, *após a /versão bash. Eu quis dizer grep -i. Eu uso, [^/]*em vez .*disso, para não pegar arquivos em diretórios cujo nome começa com WSFY.
Gilles
5
@Bernhard Consistency.
Gilles
Obrigado Gilles: apaguei o comentário anterior com sintaxe incorreta e testei a versão recomendada, mas ela não funciona sem o * (por um motivo inesperado; pelo menos para mim). A opção de maiúsculas e minúsculas não funciona mais: shopt -s extglob nocaseglob globstar; printf '%s\n' **/WSFY321.c... Acho que é por isso que é chamado de NOCASE glob : ele só funciona no contexto de um glob (ou assim parece).
Peter.O
1

Duas soluções para o macOS:

Usando o GNU find:

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

Usando o GNU sed:

brew install gnu-sed --default-names
# restart Terminal
find -name "$(sed 's|\([[:alpha:]]\)|[\U\1\L\1]|g' <<<'WSFY321.c')"
Drew Beres
fonte
1
No macOS Sierra, a opção -iname está disponível por padrão.
25417 ThomasW