Por que meu achado não é recursivo?

52

Estou executando o seguinte comando, mas não é executado de forma recursiva:

find . -name *.java

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

    
por user11498 07.04.2014 / 00:02

2 respostas

76

O problema é que você não citou o parâmetro -name . Faça isso:

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 que corresponda ao glob antes de passá-lo para find . Dessa forma, se você tivesse, digamos, foo.java no diretório atual, a linha de comando real de find seria:

find . -name foo.java

que obviamente listaria o arquivo apenas no diretório atual (a menos que você tenha alguns arquivos com nomes semelhantes mais abaixo na árvore).

As citações impedem a expansão glob e passam a linha de comando para find as-is.

Por acaso, se o glob não tivesse correspondido (sem *.java arquivos no diretório atual), você teria um de dois comportamentos dependendo de como seu shell é configurado para lidar com globs que não combinam (isto é governado pela opção nullglob no Bash, por exemplo):

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

Eu tive uma situação parecida onde eu estava cercando o valor -name entre aspas, mas ainda não estava recebendo todos os hits que eu esperava. Eu conjecturei que era por causa de links simbólicos e com certeza que era o caso. Se você quiser forçar a busca por links simbólicos, você pode modificar o comando para o seguinte:

find -L . -name '*.java'
    
por 06.08.2015 / 00:32