1

Если я хочу запустить somecommand > somefile но остановить его, как только somefile достигнет определенного размера, как бы я это сделал?

1 ответ1

3
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.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .