Como detectar se “find” encontrou alguma correspondência?

16

Existe um meio idiomático para detectar se "encontrar" encontrou alguma correspondência? Atualmente estou usando

COUNT='find ... | wc -l'
if [ "$COUNT" -gt 0 ]; then

mas isso parece um pouco indireto para mim. Além disso, gostaria de parar de pesquisar quando encontrar uma correspondência, para que não perca tempo e esforço. Eu só preciso saber se há ou não arquivos que correspondam.

Atualização: cometi o erro de escrever minha pergunta sem o código na minha frente: eu uso wc -l em um caso diferente, onde preciso saber o número total de arquivos encontrados de qualquer maneira . No caso em que estou apenas testando se há alguma correspondência, usei if [ -z $(find …) ] .

    
por Chris Page 27.05.2011 / 01:04

4 respostas

17

Se você sabe que encontrou o GNU, use -quit para que pare após o primeiro jogo.

Portável, canalize a saída de find para head -n 1 . Dessa forma, find morrerá de um cano quebrado depois de alguns jogos (quando estiver preenchido com o buffer de entrada de head ).

De qualquer forma, você não precisa de wc para testar se uma string está vazia, o shell pode fazer isso sozinho.

if [ -n "$(find … | head -n 1)" ]; then …
    
por 27.05.2011 / 09:22
6

Você pode usar o -quit ação para parar após o primeiro jogo. Você provavelmente vai querer combinar isso com outra ação (como -print ) ou você não será capaz de dizer se encontrou alguma coisa.

Por exemplo, find ... -print -quit imprimirá o caminho do primeiro arquivo correspondente e sairá. Ou você pode usar -printf 1 -quit para imprimir 1 se houver uma correspondência e nada, se não houver.

O status de saída de

find reflete se houve erros durante a pesquisa, e não se encontrou algo, por isso você precisa verificar sua saída para ver se há correspondência.

    
por 27.05.2011 / 01:58
4

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

Note que esta solução tem mais desempenho do que usar um subshell; executando falso é certamente mais rápido que executar mesmo Dash:

$ cat alfa.sh bravo.sh charlie.sh delta.sh
find -name non-existing-file -exec false {} +
find -name existing-file -exec false {} +
[ "$(find -name non-existing-file)" ]
[ "$(find -name existing-file)" ]

$ strace dash alfa.sh | wc -l
807

$ strace dash bravo.sh | wc -l
1141

$ strace dash charlie.sh | wc -l
1184

$ strace dash delta.sh | wc -l
1194
    
por 29.01.2017 / 21:48
0

Você pode envolvê-lo na condição de shell, por exemplo:

[ "$(find . ...)" '!=' '' ] && echo Found || echo Not found

Onde ... é sua condição de correspondência, por exemplo, -name *.txt .

Alguns outros exemplos:

[ "$(find /etc -name hosts)" ] && echo True || echo False
[ ! -z "$(find /etc -name hosts)" ] && echo True || echo False
    
por 23.09.2015 / 00:16

Tags