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

  • Além disso, já que você ' se estiver procurando especificamente por um arquivo, você pode provavelmente eliminar mais alguns tiques com a sinalizaçã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 …
  • Para trabalhar com algum regex, você pode fazer find . -iname \*WSFY321.c\* -type f

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 dizer grep -i. se [^/]* em vez de .* para não capturar arquivos em diretórios cujo nome comece com WSFY.
  • @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.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *