Хвост без хвоста?
Есть ли в Solaris команда для чтения файла и когда он доходит до конца для потоковой передачи, как это делает tail? Мне нужно прочитать файл с самого начала, и это бинарный файл.
Информация о Solaris и Linux будет принята с благодарностью.
2 ответа
tail -9999f будет делать что-то близкое к тому, что вы хотите. Добавьте больше 9, если ваш файл больше.
Проблемы:
- Двоичные файлы могут не содержать символов новой строки.
tail -fбудет ждать новой строки, прежде чем распечатывать что-либо. - Версия
tailв Solaris (вы не упомянули, какой Solaris, но это, вероятно, не имеет значения), вероятно, не поддерживает эту опцию. Может поддержатьtail -n 9999 -f, Возможно, вам придется приобрести GNU-версию tail. - Поскольку файл постоянно растет, существует условие гонки между выяснением его размера и запуском хвостового процесса. Вы можете пропустить начало файла, если не попросите его набрать достаточно строк.
tailне будет знать, когда вы действительно закончили запись в файл, так что вашgzipпроцесс никогда не закончится. Я не уверен, что произойдет, когда тыctrl-cположить конецtailпроцесс, но вполне вероятно, что gzip очистит после себя и удалит файл, над которым он работал.
Я предлагаю запустить исходную программу и передать вывод в gzip следующим образом:
./my_program | gunzip > new_file.txt
Таким образом, gunzip будет ждать, если my_program идет медленно, но все равно завершится, когда истинный конец файла обозначен my_program отделка.
Возможно, вам придется переписать вашу программу для записи в STDOUT, а не напрямую в файл.
Редактировать:
После просмотра справочной страницы можно решить три из приведенных выше проблем. С использованием -c <bytes> вариант вместо -n <lines> смягчает проблему 1. Использование -n +0 или же -c +0 смягчает проблему 3. Использование --pid=<PID> заставит хвост завершиться, когда оригинальная программа (работает как <PID>) завершает, что смягчает проблему 4.
В Linux вы можете использовать tail -f -n +0 /path/filename чтобы увидеть это. Хотя -n, как правило, относится к числу строк в конце файла, которые вы хотите напечатать, когда они пройдены +<n> он начинается в n-й строке от начала файла.
От tail --help:
-n, --lines=K output the last K lines, instead of the last 10;
or use -n +K to output lines starting with the Kth