Как я могу постоянно объединять файлы в каталоге, чтобы видеть последние строки самого нового файла?

Чтобы удалить завершающую новую строку, просто используйте выполнение команды:

 $ echo "test$(seq -s '' 9)no-newline"
 test12345679no-newline

Или записать в переменную:

 $ var=$(seq -s '' 9); echo "${var}0${var}"
 1234567890123456789

Или также:

 $ printf '%s' {{0..9},0,{0..9}}; echo
 1234567890123456789
0
02.03.2021, 18:38
3 ответа

Ответ Камила указал мне правильное направление, то есть использование жестких ссылок и tail -F.

Я выбрал следующее решение:

  1. С помощьюwatchre -периодически создавайте жесткую ссылку на последний файл:
watch -n 300 'ln -f $(find. | sort --reverse | head -n1)./latest.json'
  1. Используйте tail -Fдля непрерывного просмотра последней строки жестко связанного файла:
tail -F latest.json | jq '.text' 
0
18.03.2021, 22:27

Если вы хотите просмотреть все файлы в текущем каталоге, используйте эту конструкцию:

ls | cat - <(inotifywait -m --format '%f' -e create. ) | while read file ; do tail -v -f "$file" & done

Обратите внимание, что он не поддерживает наличие подкаталогов в отслеживаемом каталоге.

0
18.03.2021, 22:27

В этом решении используется tail -F(, т.е. tail --follow=name --retry), который не является переносимым. Протестировано с помощью GNU tail.

Выполните следующие действия:

  1. Создать monitoredкак обычный файл:

    : >>monitored
    
  2. Периодически проверяйте наличие файла file*.jsonновее, чем monitored. Если это так, замените monitoredжесткой ссылкой на файл :

    .
    while sleep 1; do
        find. \( -name. -o -prune \) -name 'file*.json' -newer monitored -exec ln -f {} monitored \;
    done
    

    Описанный выше цикл может выполняться в фоновом режиме.

  3. Отслеживайте monitored, следуя его имени:

    tail -F monitored
    

    Вы можете подключиться к jq '.text'или как-то еще.

Примечания:

  • Ваш явный вопрос:

    How can I continuously concatenate all files in a folder, such that I can always see the latest rows of the newest file?

    Мое решение не "непрерывно объединяется". Однако это позволяет вам «видеть последние строки самого нового файла».

  • Если бы в одну и ту же секунду было создано/обновлено много файлов file*.json, то не было бы никакой гарантии, что каждый из них отображается как monitored, хотя бы на мгновение некоторые из них можно было бы пропустить. Однако я понимаю, что ваш скрипт иногда дает сбой и автоматически перезапускается, поэтому, вероятно, от одного перезапуска к другому требуется более одной секунды. Тогда нет проблем.

    В общем проблема может быть. Я четко заявляю, что решение не является полностью надежным, когда статус «самый новый файл» слишком часто переходит от файла к файлу.

1
18.03.2021, 22:27

Теги

Похожие вопросы