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 find
apenas 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 find
apenas no diretório atual. Estou usando o OS X, 10.9.
Respostas:
O problema é que você não citou seu -name
parâmetro. 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 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 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 find
que se encontra.
Aliás, se o glob falhou em corresponder (nenhum *.java
arquivo 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 nullglob
opção no Bash , por exemplo):
find
(acidentalmente, lembre-se) exibirá o comportamento correto.find
irá 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