@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):
Se um globo que não corresponder não for expandido pelo shell, find(acidentalmente, lembre-se) exibirá o comportamento correto.
Se um glob que não corresponde é expandido para uma string vazia pelo shell, 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:
Respostas:
O problema é que você não citou seu
-name
parâmetro. Faça isso: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 parafind
. Dessa forma, se você tivesse, digamos,foo.java
no diretório atual,find
a linha de comando real seria: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 pelanullglob
opção no Bash , por exemplo):find
(acidentalmente, lembre-se) exibirá o comportamento correto.find
irá reclamar que está faltando um argumento para-name
.fonte
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:
fonte
-follow
é um sinônimo mais legível-L
, desde que você o coloque antes dos outros parâmetros.Escape the
*
fonte