Por que minha descoberta não é recursiva?


65

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

find . -name *.java

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


@Gilles: Esta sessão de perguntas e respostas é muito mais clara e menos localizada do que a burra - se uma delas deve ser fechada, é a outra.
precisa saber é o seguinte

Respostas:


88

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

find . -name '*.java'

Explicação

Sem as aspas, o shell interpreta *.javacomo 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.javano diretório atual, finda linha de comando real 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).

A citação evita a expansão glob e passa a linha de comando para o estado em findque se encontra.

Aliás, se o glob falhou em corresponder (nenhum *.javaarquivo no diretório atual), você teria um dos dois comportamentos, dependendo de como o shell está configurado para lidar com globs que não correspondem (isso é governado pela nullglobopção no Bash , por exemplo):

  1. Se um globo 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 corresponde é expandido para uma string vazia pelo shell, findirá reclamar que está faltando um argumento para -name.

20

Eu tive uma situação semelhante em que estava cercando o valor -name entre aspas, mas ainda não estava obtendo todos os resultados de busca que esperava. Supus que era por causa de links simbólicos e com certeza era esse o caso. Se você deseja forçar o find a procurar por links simbólicos, pode modificar o comando para o seguinte:

find -L . -name '*.java'

Os links simbólicos também eram meu problema. -followé um sinônimo mais legível -L, desde que você o coloque antes dos outros parâmetros.
Noumenon

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.