`tail` и добавь в oneliner

Как я мог tail и добавить текст в файл, в одну строку, в Bash?

Моя неудачная попытка будет

tail file.txt > file.txt && date >> file.txt

3 ответа

Это дает неожиданные результаты:

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

Первое перенаправление усекает файл перед началом процесса tail, поэтому tail теперь работает с пустым файлом. ( ссылка)

2 предложения:

  1. временный файл:

    f=file.txt
    tmp=$(mktemp)
    { tail "$f"; date; } > "$tmp" && mv "$tmp" "$f"
    
  2. sponge из пакета moreutils

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

Обратите внимание, что echo $(date) избыточно: вам не нужно echo отправить вывод date на выход - date делает это по умолчанию.

Другой способ без использования временных файлов или установки дополнительных инструментов (но не эффективен для больших файлов):

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

Это читает file в подстановке команд, гарантируя, что чтение file будет происходить до разрешения других перенаправлений.

Вы можете использовать Vim в режиме Ex:

ex -sc '1,-10d|x' file.txt
  1. 1,-10 выбрать все, кроме последних 10 строк

  2. d удалять

  3. x сохрани и закрой

Другие вопросы по тегам