Хвост без хвоста?
Есть ли в 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