Isso ocorre porque o bash processa o redirecionamento com o >
primeiro, excluindo o conteúdo do arquivo. Em seguida, ele executa o comando. Se você usasse >>
, as últimas 50 linhas seriam anexadas ao final do que está atualmente no arquivo. Nesse caso, você teria as mesmas 50 linhas repetidas duas vezes.
O comando funciona conforme o esperado ao redirecionar para um arquivo diferente. Aqui está uma maneira de gravar as últimas 50 linhas de um arquivo em um arquivo com o mesmo nome:
tail -50 /home/pi/Documents/test > /home/pi/Documents/test2 && mv /home/pi/Documents/test2 /home/pi/Documents/test
Isso primeiro grava as últimas 50 linhas em um arquivo temporário, que é movido usando-se mv
para substituir o arquivo original.
Conforme observado nos comentários, isso não funcionará se o arquivo ainda estiver aberto. Mover o arquivo também cria um novo inode e pode alterar a propriedade e as permissões. Uma maneira melhor de fazer isso usando um arquivo temporário seria:
tail -50 /home/pi/Documents/test > /home/pi/Documents/test2 ; cat /home/pi/Documents/test2 > /home/pi/Documents/test
O arquivo temporário também pode ser removido, embora cada vez que isso aconteça, seu conteúdo seja sobrescrito.