Если я хочу запустить somecommand > somefile
но остановить его, как только somefile
достигнет определенного размера, как бы я это сделал?
1 ответ
somecommand | dd bs=1K count=2 iflag=fullblock > somefile
Это записывает в файл ровно 2 КиБ (меньше, если somecommand
завершается первой). POSIX не требует iflag=fullblock
, ваш dd
может не поддерживать его, команда, содержащая iflag=fullblock
, не переносима. Сравните этот сценарий, чтобы понять, почему это может быть важно.
После обработки правильного количества блоков (count=2
в приведенном выше примере) dd
завершается, это разрывает канал. Это зависит от somecommand
как она реагирует на сломанную трубу. Посмотрите на это: что делает процесс Unix умирающим из-за сломанной трубы?
Если количество байтов, которое вы хотите сохранить, вынуждает вас использовать некоторые неудобные bs
и / или count
, учтите это:
somecommand | { dd bs=1M count=1024 iflag=fullblock; dd bs=10 count=1 iflag=fullblock; } > somefile
Команда запишет 1 ГиБ (= 1024 МБ) плюс 10 байтов.
Некоторые реализации head
позволяют вам использовать опцию -c
для получения произвольного количества байтов. Это также не переносимо, опция не требуется POSIX.
Согласно этому ответу dd
с размером входного блока 1 (ibs=1
) является единственным способом POSIX для считывания точного количества байтов.
Если somecommand
генерирует текстовый вывод и вы хотите ограничить количество строк в файле, то head
- правильный инструмент. Это сохранит только первые 5 строк (опять же, меньше, если somecommand
заканчивается первым):
somecommand | head -n 5 > somefile
Опция -n
head
требуется POSIX.