Como parar o comando find após o segundo jogo?

3

Como fazer o comando find , que mostrará apenas as duas primeiras correspondências e, em seguida, finalizará algo semelhante a Como parar o comando find após o primeiro jogo? apenas a versão para dois registros.

    
por harcotlupus 08.11.2017 / 17:17

2 respostas

1

Substitua 1 para 2 na sua resposta vinculada.

find . ... -print | head -n 2

Note que isso faz assumir que os nomes dos arquivos são são, ou seja, eles não contêm novas linhas. Portanto, não é o mais adequado para uma solução de script. (Veja Por que o looping faz com que o resultado seja uma má prática? para mais detalhes.) Ainda é de longe a abordagem mais adequada para uso interativo rápido.

Observe também que em um sistema com muitos arquivos, isso será mais rápido do que a abordagem -exec sh -c 'echo "$1"; echo "$2"' _ {} + , porque o processo find receberá o SIGPIPE quando ele tentar gravar mais nomes após head ter sido concluído, e então find terminará.

Sem mencionar que o comando -exec pode imprimir LOT em mais de 2 resultados se houver muitos resultados suficientes. Por exemplo, find / -exec sh -c 'echo "$1"; echo "$2"' _ {} + não sairá por muito tempo e imprimirá dois arquivos de cada resultado ARG_MAX, em vez de dois arquivos no total.

    
por 08.11.2017 / 17:18
0

Usando find com invocação de sh :

find . -type f -exec sh -c 'echo "$1" "$2"; done' _ {} +

Isso expandirá todos os arquivos desde o uso de + terminator de -exec , então estamos apenas imprimindo primeiro e segundo argumentos que são primeiro e segundo arquivos find encontrados.

Ou use o seguinte, onde você pode especificar após quantos arquivos encontrados (talvez não 2 arquivos, 100 arquivos! então acima você deve especificar todos os 100 arquivos!) sair do comando (na verdade shell envie o comando exit e faça com que find saia do processo de execução).

find -type f -exec sh -c '
    for file; do echo "$file"; c=$((c+1)); [ $c = 2 ] && exit; done' _ {} +
    
por 08.11.2017 / 18:14

Tags