Estou procurando o arquivo “WSFY321.c” em uma hierarquia de diretórios enorme.
Normalmente, eu usaria GNU find : find . -name "WSFY321.c"
Mas eu não sei o caso, pode ser maiúsculo, minúsculo ou uma mistura de ambos.
Qual é a maneira mais fácil de encontrar este arquivo?
Existe algo melhor do que find . | grep -i "WSFY321.c"
?
Resposta
Versões recentes do GNU find
têm um sinalizador -iname
, para pesquisas de nomes que não diferenciam maiúsculas de minúsculas.
find . -iname "WSFY321.c"
Comentários
Resposta
Com GNU find, ou outras versões de find que o tenham:
find . -iname "WSFY321.c"
Com outras versões:
find . -name "[Ww][Ss][Ff][Yy]321.[Cc]"
Ou um compromisso que “é mais lento, mas fácil de digitar:
find . -name "????321.c" | grep -i "/WSFY[^/]*$"
Ou em zsh:
print -rl -- **/(#i)WSFY321.c
Comentários
- @Gilles A versão
grep
está filtrando apenas maiúsculas e eu não ' t compreender o ' [^ /] ' .. (não /) - @Gilles Qual é o argumento para usar aspas simples no primeiro caso (nome do arquivo exato) em vez de nenhuma aspas?
- @ Peter.O Não
*
após o/
na versão bash. Eu quis dizergrep -i
. se[^/]*
em vez de.*
para não capturar arquivos em diretórios cujo nome comece comWSFY
. - @Bernhard Consistency.
- Obrigado Gilles: Excluí o comentário anterior com a sintaxe incorreta e testei a versão corrigida, mas não ' t funciona sem o * (por um motivo inesperado; para mim, pelo menos). A opção que não diferencia maiúsculas de minúsculas não funciona mais:
shopt -s extglob nocaseglob globstar; printf '%s\n' **/WSFY321.c
… Suponho que ' é por isso que é chamado de nocase glob : só funciona no contexto de um glob (ou assim parece).
Resposta
Duas soluções 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")"
Comentários
- No macOS Sierra, a opção -iname está disponível por padrão.
-type f
para que ganhe ' não se preocupe em olhar para o nome se o inode for um diretório. Mas esses ' níveis pedantes de otimização …find . -iname \*WSFY321.c\* -type f