У меня есть файл, в начале и конце которого есть мусор (двоичный заголовок и нижний колонтитул). Я хотел бы узнать, как уничтожить эти байты. Для примера предположим, что есть 25 байт с начала. И 2 байта с конца.
Я знаю, что могу использовать truncate и dd, но truncate не работает с потоком, и кажется немного неуклюжим запускать две команды на жестком файле. Было бы лучше, если бы truncate
, зная размер файла, мог бы cat файл в dd
. Или, если бы был более приятный способ сделать это?
решение1
решение2
ддсделает для вас оба в одной команде. Установите размер блока в 1 байт, пропустите 25 первых байтов, посчитайте до размера файла минус пропуск и конечные байты.
100 byte file
file.img
dd if=./file.img of=./trimed_file.img bs=1 skip=25 count=73
Дважды проверьте числа, так как они могут начинаться с 0.
решение3
С ksh93:
{ head -c "$n"; } < file <#((n = EOF - 25 - 2 , 25))
Или сделать это на месте:
{ head -c "$n"; } < file <#((n = EOF - 25 - 2 , 25)) 1<>; file
Если у вас /opt/ast/bin
впереди есть $PATH
, вы получите head
встроенный .
<#((...))
являетсяlseek()
оператором....
интерпретируется как арифметическое выражение, гдеEOF
— длина файла. Таким образом, выше мы назначаем длину отображаемой части$n
и ищем 25 байтов в файле.<>;
— оператор перенаправления «открыть в режиме чтения+записи и усечь, если команда выполнена успешно».