Estou executando o seguinte comando, mas não é executado recursivamente:

find . -name *.java 

Eu sei que há arquivos java mais abaixo no diretório atual, mas ele está executando o find apenas no diretório atual. Estou usando o OS X, 10.9.

Resposta

O problema é que você não citou seu . Em vez disso, faça isto:

find . -name "*.java" 

Explicação

Sem as aspas, o shell interpreta *.java como um padrão glob e o expande para qualquer nome de arquivo correspondente ao glob antes de passá-lo para find. Dessa forma, se você tivesse, digamos, foo.java no diretório atual, find “a linha de comando real seria:

find . -name foo.java 

que obviamente listaria o arquivo apenas no diretório atual (a menos que você tenha algum nome semelhante arquivos mais abaixo na árvore).

Citar impede a expansão global e passa a linha de comando para find no estado em que se encontra.

A propósito, se o glob falhou ao corresponder (nenhum arquivo *.java no diretório atual tory), você obteria um de dois comportamentos, dependendo de como seu shell está configurado para lidar com globs que não correspondem (isso é regido pela opção nullglob no Bash, por exemplo ):

  1. Se um glob que não corresponde não for expandido pelo shell, find exibirá (acidentalmente, lembre-se) o comportamento correto.
  2. Se um glob que não corresponde for expandido em uma string vazia pelo shell, find irá reclamar que está faltando um argumento para -name.

Resposta

Tive uma situação semelhante em que estava cercando o -name valor entre aspas, mas ainda não estava obtendo todas as ocorrências de localização que eu esperava. Eu conjecturei que era por causa de links simbólicos e com certeza era esse o caso. Se você deseja forçar a busca por links simbólicos, você pode modificar o comando para o seguinte:

find -L . -name "*.java" 

Comentários

  • Symlinks também eram o meu problema. -follow é um sinônimo mais legível para -L, contanto que você o coloque antes dos outros parâmetros.
  • Ótimo ! Muito obrigado!! +1!

Resposta

Escape de *

find . -name \*.java 

Deixe uma resposta

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