2016-01-22 6 views
5

У меня есть программа, которая записывает свой вывод в файл * .out при запуске. Я установил скрипт bash для запуска нескольких разных времен, поэтому каждый запуск записывает в другой файл * .out. Я обнаружил, что я мог бы tail самый последний * .OUT файл, как это:Хвост последнего файла

watch tail $(ls -tr *.out | tail -n1) 

Проблема, кажется, что ссылки $() только получает выполняется один раз. Поэтому, когда первый запуск заканчивается, watch продолжает tail тот же * .out файл, хотя теперь есть новый * .out файл.

Как я могу изменить это, чтобы перейти к следующему * .out файлу после завершения одного запуска?

Я попытался сделать некоторые вложения кавычек и круглых скобок, но я не совсем понимаю детали ссылок. Вопросы осложняются тем фактом, что watch передает свою команду sh, хотя я использую bash.

Бонусные баллы: было бы здорово, если бы это можно было изменить до tail -f вместо того, чтобы просто повторять watch каждые n секунд.

+2

hm..I действительно не понимаю, кейс для использования. Вы хотите прочитать несколько файлов в режиме реального времени? если да, проще использовать 'tail -f * .out' – pivanchy

+0

Как правило, я согласен с @pivanchy, хотя стоит упомянуть, что POSIX' tail' не может обрабатывать более одного файла за раз. – kojiro

+0

@pivanchy - это решение. Я не понимал, что все так просто. –

ответ

2

Я также занимался этой проблемой, и, наконец, пришли к этому решению:

watch "ls -t1 | sed q | xargs tail" 

нужно, чтобы получить немного Hacky для бонуса. Команда tail также поддерживает аргумент --pid, который заставляет tail умереть, как только наступит PID. Звучит хорошо? Вот некоторые картины вы могли бы использовать:

while true; do ls -t1 | sed q | xargs lsof -F np | sed 's/.\(.*\)/\1/g' | xargs tail -f --pid 2>/dev/null ; done 

Это в основном отслеживает наиболее текущий файл и перезагружает tail при завершении процесса записи файла.

+0

Спасибо! Мне просто пришлось добавить простой файловый фильтр: 'watch ls -t1 * .out | sed q | xargs tail "' –

+1

@JeffIrwin Также попробуйте отредактировать. Он больше не смотрит файл, а сразу выводит результат (с хвостом). – steffen

+1

Редактирование отлично работает! Я даже не собираюсь пытаться понять все конвейеры. –

1

Итак, я дублировать немного мой текущий ответ: Tail the most recent file

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

tail -f *.out 

хвост работает с несколькими файлами тоже, и это возможно использовать его как:

tail -f file1 file2 file3 

Итак, как вы можете видеть, это очень мощный и удобный инструмент, и вам не нужно играть с командой Linux S

1

Если все файлы существуют, чтобы начать с, и у Вас есть современная реализация tail, который может обрабатывать несколько файлов,

tail -f *.out 

, казалось бы лучшим решением. Но если у вас нет всех файлов для начала, тогда все равно было бы проще, если бы вы только что создали их. *.out расширится только на файлы, которые у вас уже есть.

Но если вы не можете узнать имена файлов для tail -f, прежде чем вы начнете, вам понадобится перезапустить хвост, если какие-либо новые файлы будут созданы во время вашего хвоста.В этом случае, учитывая вы только переписываться выходной_файл по одному за раз, вы можете сделать:

inotifywait -m -e create -q . | while read dir event file; do 
    kill %tail 
    tail -f "$file" & 
done 
kill %tail 

(выше требует inotifywait, который включен в inotify-tools на системах Debian на основе, как Ubuntu.) Это часы текущий каталог для вновь созданных файлов, хвосты в зависимости от того, какой файл был создан, в фоновом режиме и убивает предыдущую команду хвоста всякий раз, когда создается новый файл.

 Смежные вопросы

  • Нет связанных вопросов^_^