Respostas:
Aqui está uma frase que acredito que faz o que você quer:
find /tmp -name something | egrep '.*'
O status de retorno será 0quando algo for encontrado e diferente de zero.
Se você também precisar capturar a saída findpara processamento adicional, a resposta de Sven cobriu isso.
find ... | read
Solução mais simples que não imprime, mas sai 0 quando os resultados são encontrados
find /tmp -name something | grep -q "."
A saída 0 é fácil com a localização, a saída> 0 é mais difícil porque isso geralmente acontece apenas com um erro. No entanto, podemos fazer isso acontecer:
if find -type f -exec false {} +
then
echo 'nothing found'
else
echo 'something found'
fi
findnão parece depender dos códigos de saída de nenhum -execs executado.
execseção, sem valor de retorno). Ele não consegue diferenciar entre nada encontrado e se vê errando (por exemplo, quando foi chamado em um ponto de partida inexistente).
Tendo acabado de encontrar esta pergunta enquanto tentava encontrar minha maneira de resolver um problema com o Puppet (alterar permissões nas pastas em um diretório, mas não no próprio diretório), isso parece funcionar:
! test -z $(find /tmp -name something)
Meu caso de uso específico é este:
! test -z $(find /home -mindepth 1 -maxdepth 1 -perm -711)
O que sairá do código 1 se o comando find não encontrar arquivos com as permissões necessárias.
Não é possível. Find retorna 0 se sair com êxito, mesmo que não tenha encontrado um arquivo (que é um resultado correto, não indicando um erro quando o arquivo realmente não existe).
Para citar a página de manual de localização
ESTADO DE SAÍDA
encontre saídas com status 0 se todos os arquivos forem processados com êxito, maior que 0 se ocorrerem erros. Esta é uma descrição deliberadamente muito ampla, mas se o valor de retorno for diferente de zero, você não deve confiar na exatidão dos resultados da localização.
Dependendo do que você deseja alcançar, você pode tentar encontrar -printo nome do arquivo e testar a saída:
#!/bin/bash
MYVAR=`find . -name "something" -print`
if [ -z "$MYVAR" ]; then
echo "Notfound"
else
echo $MYVAR
fi
exec/ execdir(usada com +):If any invocation returns a non-zero value as exit status, then find returns a non-zero exit status.
Eu sinto que este é o método mais conciso e direto:
test `find /tmp/ -name something -print -quit 2>/dev/null`
-print -quit, o que pode resolver sua preocupação.
Aqui está um pequeno script que eu chamei test.py. Ele aprimora os outros métodos publicados, na medida em que retornará um código de erro se um estiver definido e, adicionalmente, um se encontrar não listou nenhum arquivo:
from subprocess import Popen
import sys
p = Popen(['find'] + sys.argv)
out, err = p.communicate()
if p.returncode:
sys.exit(p.returncode)
if not out:
sys.exit(1)
Aqui está a saída da linha de comando:
$ python test.py . -maxdepth 1 -name notthere
$ echo $?
1
$ find . -maxdepth 1 -name notthere
$ echo $?
0
$ find . -failedarg
find: unknown predicate `-failedarg'
$ echo $?
1
Em seguida, para um resultado em que find teve erros, mas encontrou arquivos:
$ ls -lh
$ d--------- 2 jeff users 6 Feb 6 11:49 noentry
$ find .
.
./noentry
find: `./noentry': Permission denied
$ echo $?
1
$ find . | egrep '.*'
.
./noentry
find: `./noentry': Permission denied
$ echo $?
0
python ../test.py
../test.py
$ echo $?
1
Então, se você quiser a lista de arquivos, poderá -print 0passar finde dividir a variável out em valores nulos ou simplesmente adicionar uma instrução de impressão para ela.
Não é apenas findisso que retorna os códigos de status de saída como zero quando é bem-sucedido. No unix, seja qual for o comando que você executa, se for bem-sucedido, ele retornará o status de saída como zero.
*noegrepregex é completamente redundante. Como você não está usandoegrepsintaxe de expressão regular, a idade antigagreppode ser alguns microssegundos mais rápida.