Respostas:
Aqui está uma frase que acredito que faz o que você quer:
find /tmp -name something | egrep '.*'
O status de retorno será 0
quando algo for encontrado e diferente de zero.
Se você também precisar capturar a saída find
para 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
find
não parece depender dos códigos de saída de nenhum -exec
s executado.
exec
seçã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 -print
o 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 0
passar find
e dividir a variável out em valores nulos ou simplesmente adicionar uma instrução de impressão para ela.
Não é apenas find
isso 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.
*
noegrep
regex é completamente redundante. Como você não está usandoegrep
sintaxe de expressão regular, a idade antigagrep
pode ser alguns microssegundos mais rápida.