Por que **encontra** não encontra nada?
Pergunta
Estou procurando arquivos de scripts shell instalados em meu sistema, mas encontrar não funciona:
$ find /usr -name *.sh
Mas eu sei que há muitos scripts por aí.Por exemplo:
$ ls /usr/local/lib/*.sh
/usr/local/lib/tclConfig.sh
/usr/local/lib/tkConfig.sh
Por que não encontrar trabalhar?
Solução
Tente citar o curinga:
$ find /usr -name \*.sh
ou:
$ find /usr -name '*.sh'
Se acontecer de você ter um arquivo que corresponda *.sh no diretório de trabalho atual, o curinga será expandido antes que find o veja.Se acontecer de você ter um arquivo chamado tkConfig.sh em seu diretório de trabalho, o encontrar comando seria expandido para:
$ find /usr -name tkConfig.sh
que encontraria apenas arquivos chamados tkConfig.sh.Se você tivesse mais de um arquivo correspondente *.sh, você receberia um erro de sintaxe de encontrar:
$ cd /usr/local/lib
$ find /usr -name *.sh
find: bad option tkConfig.sh
find: path-list predicate-list
Novamente, o motivo é que o curinga se expande para ambos os arquivos:
$ find /usr -name tclConfig.sh tkConfig.sh
Citar o curinga evita que ele seja expandido prematuramente.
Outra possibilidade é que /usr ou um de seus subdiretórios seja um link simbólico. encontrar normalmente não segue links, então você pode precisar do -seguir opção:
$ find /usr -follow -name '*.sh'
Outras dicas
Em alguns sistemas (Solaris, por exemplo), não há ação padrão, então você precisa adicionar o comando -print.
find /usr -name '*.foo' -print
Para encontrar arquivos em seus discos, enxuta para usar "Localizar", em vez disso, é instantâneo (procure um exemplo de índice construído diariamente), você seria:
locate '/usr*.sh'