sponge
de moreutils é bom para isso. Será:
soak up standard input and write to a file
Você usa assim:
tail -n 100 file | sponge file
para obter exatamente o efeito desejado.
Eu queria tail
as últimas 100 linhas de um arquivo para o mesmo arquivo, mas o comando
tail -n 100 file > file
não funciona, eu suponho porque o stdout é gravado no arquivo 'live', antes de tudo ser lido no arquivo original.
Existe alguma maneira de canalizar a saída para algo , que a mantém até que todas as 100 linhas estejam lá e, em seguida, a envie para o arquivo? Ou apenas outra maneira de encurtar o arquivo dessa maneira?
sponge
de moreutils é bom para isso. Será:
soak up standard input and write to a file
Você usa assim:
tail -n 100 file | sponge file
para obter exatamente o efeito desejado.
Claro, no momento em que finalmente faço a pergunta sobre SE, a resposta vem para mim. Eu acho que menos o que eu preciso, então eu apenas escrevo:
tail -n 100 file | less > file
Em:
tail -n 100 file > file
O shell bifurca um processo, abre file
para escrever nele, com truncamento (isto é, tornando-o um arquivo vazio) e, em seguida, executa tail
nesse processo. Para abrir file
sem truncamento, você pode usar o operador de redirecionamento <>
:
tail -n 100 file 1<> file
O problema é que não haverá truncamento. Ou seja, file
será substituído por suas últimas 100 linhas, mas depois dessas 100
linhas, o que estava originalmente no arquivo ainda estará lá. Então você precisaria chamar outro comando para fazer o truncamento após tail
ter terminado.
{ tail -n 100 file; perl -e 'truncate STDOUT, tell STDOUT'; } 1<> file
Você pode fazer assim:
printf '%s\n' "$(tail -n 100 file)" > file