Есть ли простой способ обрезать файл в трубе? В частности, я хочу обрезать последние четыре байта файла перед передачей его в другой процесс.
В идеале я мог бы написать что-то вроде:
cat input.txt | some-process | truncate --size=-4 | another-process > output.txt
но похоже, что truncate
команда действует только «на месте» над файлом на диске.
pipe
bash-scripting
kostmo
источник
источник
cat input.txt | some-process
лучше написано какsome_process < input.txt
.Ответы:
Это как если бы я сказал вам поднять руку, как только произнесу четвертое от последнего слова, которое я собираюсь сказать. Я не собираюсь говорить вам заранее, сколько слов я собираюсь сказать.
Труба - это поток . Его данные не имеют размера, у него есть только операции для получения следующего элемента из него и / или вставки в него элемента, и результатом является либо фрагмент данных, либо сигнал о том, что данных больше нет.
Таким образом, если вы сначала не извлечете все данные из потока, не поместите их в буфер, не подсчитаете их длину, не перемотаете поток и не получите на четыре элемента меньше, это невозможно сделать.
РЕДАКТИРОВАТЬ: мне нужно сделать больше продумывая вещи вместо того, чтобы придумывать умные аналогии :) Поток не говорит «немедленно остановить меня n элементов перед последним», а скорее «передать все элементы, кроме последнего n», и путем поддержания буфер из только n элементов, и ожидание, пока первые n элементов не будут получены, прежде чем передать первый, возможно. Очевидно, что это не будет работать в таких ситуациях, как телекоммуникации, когда вы хотите, чтобы данные отправлялись сразу после их получения, как вы могли бы, если бы вам нужны были первые n элементов. И я полагаю
truncate
, не делает это таким образом.(попытка понизить самость -1)
источник
Я чувствую себя глупо после написания этого скрипта Python.
Для этого есть встроенная команда оболочки
head
:cat input.txt | some-process | head --bytes=-4 | another-process > output.txt
Редактировать: Команда GNU
head
имеет концептуально похожую реализацию (т.е. эффективную для памяти) с моей реализацией Python ниже. Одно из отличий состоит в том, что он округляет размер кольцевого буфера (N
количество пропущенных байтов) до кратного некоторого стандартного размера буфера.источник
head
версия не слишком старая, которая будет работать.sed
может работать на последней строке. Это предполагает, что последние 4 символа находятся в одной строке:выходы
источник
Я не смог найти никаких встроенных команд оболочки, чтобы сделать это, поэтому я предполагаю, что это означает, что не существует «однострочного» решения. Тем не менее, я смог написать скрипт Python, чтобы сделать то, что мне нужно:
Тогда я призываю
cat input.txt | some-process | ./pipetruncate.py 4 | another-process > output.txt
источник
Потратил часть утра на написание скрипта на python. Конечно, вам лучше использовать свою «голову» вместо того, чтобы писать больше кода. В любом случае, вот моя версия. Это ужасно, но я думаю, что это мой первый скрипт на Python:
источник
Я удивлен, что никто
dd
еще не упоминается .Это будет читать первые 1024 байта ввода:
Это пропустит первые 2048 байтов ввода:
Удаляя параметр
if
и / илиof
параметр (ы),dd
будет считывать из STDIN и записывать в STDOUT. Это означает, что вы можете делать такие вещи:В зависимости от того, какой версии
dd
вы работаете, вы можете указать единицы размера дляcount
иskip
параметров (см страницы человека для более подробной информации).источник