Parar o comando do terminal quando a saída atingir um determinado tamanho?

1

Se eu quiser executar somecommand > somefile , mas pará-lo uma vez somefile atinge um determinado tamanho, como eu faria isso?

    
por Silas Reel 07.10.2018 / 23:52

1 resposta

3
somecommand | dd bs=1K count=2 iflag=fullblock > somefile

Isso gravará exatamente 2 KiB no arquivo (menos se somecommand terminar primeiro). iflag=fullblock não é requerido pelo POSIX, o dd pode não suportar, o comando contendo iflag=fullblock não é portável. Compare este cenário para ver por que isso pode ser importante.

Depois de processar o número correto de blocos ( count=2 no exemplo acima) dd termina, isso interrompe o pipe. Cabe a somecommand como ele reage a um cano quebrado. Veja isto: O que faz um processo Unix morrer com cano quebrado?

Se a quantidade de bytes que você deseja manter obriga você a usar alguns inconvenientes bs e / ou count , considere isto:

somecommand | { dd bs=1M count=1024 iflag=fullblock; dd bs=10 count=1 iflag=fullblock; } > somefile

O comando gravará 1 GiB (= 1024 MiB) mais 10 bytes.

Algumas implementações de head permitem que você use a opção -c para obter um número arbitrário de bytes. Isso também não é portátil, a opção não é exigida pelo POSIX.

De acordo com esta resposta dd com um tamanho de bloco de entrada de 1 ( ibs=1 ) é a somente a maneira POSIX de ler um número exato de bytes.

Se somecommand gerar saída textual e você quiser limitar o número de linhas no arquivo, head é a ferramenta certa. Isso salvará as primeiras 5 linhas somente (novamente, menos se somecommand terminar primeiro):

somecommand | head -n 5 > somefile

A opção -n de head é exigida pelo POSIX.

    
por 08.10.2018 / 00:04