'tail' e acrescentar no oneliner

1

Como eu poderia tail e acrescentar um texto em um arquivo, em uma linha, no Bash?

Minha tentativa falhada seria

tail file.txt > file.txt && date >> file.txt
    
por autorun 15.01.2016 / 00:28

3 respostas

3

Isso produz resultados inesperados:

tail file.txt > file.txt && echo $(date) >> file.txt

O primeiro redirecionamento trunca o arquivo antes que o processo final seja iniciado, de modo que o tail agora está operando em um arquivo vazio. ( ref )

2 sugestões:

  1. um arquivo temporário:

    f=file.txt
    tmp=$(mktemp)
    { tail "$f"; date; } > "$tmp" && mv "$tmp" "$f"
    
  2. sponge do moreutils pacote

    f=file.txt
    { tail "$f"; date; } | sponge "$f"
    

Observe que echo $(date) é redundante: você não precisa de echo para enviar a saída de date para stdout - date faz isso por padrão.

    
por glenn jackman 15.01.2016 / 00:39
1

Outra maneira sem usar arquivos temporários ou instalar ferramentas adicionais (mas não eficiente para arquivos grandes):

<<<"$(<file)" tail >file && date >>file

Isso lê file em uma substituição de comando, garantindo que a leitura de file ocorra antes que os outros redirecionamentos sejam resolvidos.

    
por kos 15.01.2016 / 00:55
0

Você pode usar o Vim no modo Ex:

ex -sc '1,-10d|x' file.txt
  1. 1,-10 seleciona todas menos as últimas 10 linhas

  2. d delete

  3. x salvar e fechar

por Steven Penny 11.04.2016 / 00:57