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 ):
- Se um glob que não corresponde não for expandido pelo shell,
find
exibirá (acidentalmente, lembre-se) o comportamento correto. - 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
Resposta
Escape de *
find . -name \*.java
-follow
é um sinônimo mais legível para-L
, contanto que você o coloque antes dos outros parâmetros.