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 não perder tempo e esforço. Eu só preciso saber se existem ou não arquivos correspondentes.
Atualização: cometi o erro de escrever minha pergunta sem o código à minha frente: 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 testando apenas se há alguma correspondência, eu estava usando if [ -z $(find …) ]
.
-n
só se aplicava a variáveis 'definidas' ($ abc, $ xyz, etc), mas suponho que $ (...) seja uma variável temporária 'definida' .. +1 ... (e eu apenas leia recentemente que o uso-n
é arriscado, a menos que você tenha certeza de que a variável ainda não foi declarada e não está sendo usada) ... mas uma temperatura não terá essa possibilidade ... ou seja. vs não inicializada esvaziar-n
testa se uma string está vazia, não tem nada a ver com variáveis. O que você leu provavelmente estava dizendo que o uso-n
não testa se uma variável está definida:-n "$foo"
é false sefoo
está definido, mas está vazio e exibe uma mensagem de erro emset -u
.[ -n "${foo+1}" ]
testa de forma confiável sefoo
está definido, mas tratar variáveis vazias e não definidas de maneira idêntica geralmente é uma boa idéia:[ -n "${foo:+1}" ]
ou apenas[ -n "$foo" ]
se você não estiver preocupadoset -u
.-quit
disponível, mas estou indo para ohead -n 1
trabalho (como fazhead -c 1
, que para ainda mais cedo, mas provavelmente com benefícios insignificantes). Além disso, cometi o erro de escrever minha pergunta sem o código à minha frente: usowc -l
em outro caso, em que preciso saber o número total de arquivos encontrados. No caso em que estou testando apenas se há alguma correspondência, eu estava usandoif [ -z `find … ` ]
.Você pode usar a
-quit
ação para parar após a primeira partida. Você provavelmente desejará combinar isso com outra ação (como-print
) ou não poderá saber se encontrou alguma coisa.Por exemplo,
find ... -print -quit
imprimirá o caminho do primeiro arquivo correspondente e sairá. Ou então, você pode-printf 1 -quit
imprimir 1 se houver uma correspondência e nada se não houver.find
O status de saída de reflete se houve erros durante a pesquisa e não se encontrou alguma coisa; portanto, você deve verificar sua saída para ver se há uma correspondência.fonte
-quit
é uma extensão GNU. Ele não funcionará em sistemas que usam outras implementações do find (1), como OS X, BSDs e provavelmente a maioria dos Unices comerciais.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:
Observe que esta solução é mais eficiente do que usar um subshell; executar false é certamente mais rápido do que executar até o Dash:
fonte
Você pode envolvê-lo na condição de shell, por exemplo:
Onde
...
está sua condição de correspondência, por exemplo-name *.txt
.Alguns outros exemplos:
fonte