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.
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.
Respostas:
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):
find(acidentalmente, lembre-se) exibirá o comportamento correto.findirá reclamar que está faltando um argumento para -name.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'
-followé um sinônimo mais legível -L, desde que você o coloque antes dos outros parâmetros.
Escape the *
find . -name \*.java