Posso fazer com que 'find' retorne 0 quando nenhum arquivo correspondente for encontrado?

33

Mesmo quando /tmp não tiver um arquivo chamado something , a pesquisa com find retornará 0:

  $ find /tmp -name something 
  $ echo $?
  0

Como posso obter um status de saída diferente de zero quando find não encontra nada?

    
por yael 23.01.2011 / 16:12

8 respostas

35

Aqui está um verso 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 precisa capturar a saída de find para processamento adicional, a resposta de Sven cobriu isso.

    
por 23.01.2011 / 18:08
7

A saída 0 é fácil com a localização, a saída > 0 é mais difícil porque isso geralmente só acontece com um erro. No entanto, podemos fazer isso acontecer:

if find -type f -exec false {} +
then
  echo 'nothing found'
else
  echo 'something found'
fi
    
por 29.01.2017 / 21:50
6

Solução mais simples que não é impressa, mas sai com 0 quando os resultados são encontrados

find /tmp -name something | grep -q "."
    
por 11.06.2017 / 05:31
4

Não é possível. Encontre retorna 0 se ele sair com sucesso, 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 manpage do find

EXIT STATUS

find exits with status 0 if all files are processed successfully, greater than 0 if errors occur. This is deliberately a very broad description, but if the return value is non-zero, you should not rely on the correctness of the results of find.

Dependendo do que você deseja alcançar, você pode tentar encontrar -print do nome do arquivo e testar sua saída:

#!/bin/bash
MYVAR='find . -name "something" -print'
if [ -z "$MYVAR" ]; then
    echo "Notfound"
else
   echo $MYVAR
fi
    
por 23.01.2011 / 16:28
2

Tendo acabado de encontrar esta pergunta enquanto tentava encontrar uma maneira de resolver um problema com o Puppet (altere as permissões em 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 é o seguinte:

! test -z $(find /home -mindepth 1 -maxdepth 1 -perm -711)

Que sairá do código 1 se o comando find não encontrar arquivos com as permissões necessárias.

    
por 04.04.2016 / 16:24
0

Aqui está um pequeno script que chamei de test.py . Ele aprimora outros métodos postados, pois ele retornará um código de erro se estiver definido e, adicionalmente, definirá um se o find não listar 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 o find encontrou 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, você pode usar -print 0 passado para find e dividir a variável out em nulos, ou você pode simplesmente adicionar uma declaração de impressão para ela.

    
por 06.02.2013 / 20:56
0

Eu sinto que este é o método mais conciso e direto:

test 'find /tmp/ -name something -print -quit 2>/dev/null'
    
por 06.02.2013 / 19:42
-1

Não é apenas find que retorna os códigos de status de saída como zero quando é bem-sucedido. No unix o que quer que o comando você execute, se for bem sucedido, ele retornará o status de saída como zero.

    
por 18.01.2012 / 19:21