Com o GNU ou FreeBSD find
, você pode usar o predicado -quit
:
find . ... -print -quit
O equivalente de find
do NetBSD:
find . ... -print -exit
Se tudo o que você fizer é imprimir o nome e assumir que os nomes de arquivo não contêm caracteres de nova linha, você pode fazer:
find . ... -print | head -n 1
Isso não parará find
após a primeira partida, mas possivelmente, dependendo do tempo e do buffer na segunda partida ou (muito) depois. Basicamente, find
será terminado com um SIGPIPE quando ele tentar gerar algo enquanto head
já tiver desaparecido, porque ele já leu e exibiu a primeira linha de entrada.
Observe que nem todos os shells aguardarão o comando find
depois que head
retornou. As implementações de shell Bourne e AT & T de ksh
(quando não interativas) e yash
(somente se esse pipeline for o último comando em um script) não o deixariam em execução em segundo plano. Se preferir ver esse comportamento em qualquer shell, você sempre poderá alterar o acima para:
(find . ... -print &) | head -n 1
Se você estiver fazendo mais do que imprimindo os caminhos dos arquivos encontrados, tente essa abordagem:
find . ... -exec sh -c 'printf "%s\n" "$1"; kill "$PPID"' sh {} \;
(substitua printf
pelo que você faria com esse arquivo).
Isso tem o efeito colateral de find
retornar um status de saída refletindo o fato de que ele foi morto.
Na verdade, usar o sinal SIGPIPE em vez de SIGTERM ( kill -s PIPE
em vez de kill
) fará com que alguns shells fiquem mais silenciosos sobre essa morte (mas ainda retornem um status de saída diferente de zero).