Как обрезать байты в начале и конце файла?

Как обрезать байты в начале и конце файла?

У меня есть файл, в начале и конце которого есть мусор (двоичный заголовок и нижний колонтитул). Я хотел бы узнать, как уничтожить эти байты. Для примера предположим, что есть 25 байт с начала. И 2 байта с конца.

Я знаю, что могу использовать truncate и dd, но truncate не работает с потоком, и кажется немного неуклюжим запускать две команды на жестком файле. Было бы лучше, если бы truncate, зная размер файла, мог бы cat файл в dd. Или, если бы был более приятный способ сделать это?

решение1

Вы можете объединить GNUtailиhead:

tail -c +26 file | head -c -2

выведет содержимое, fileначиная с байта 26 и останавливаясь за два байта (минус два -2) до конца. ( -cработает с байтами, а не с символами.)

решение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 байтов в файле.
  • <>;— оператор перенаправления «открыть в режиме чтения+записи и усечь, если команда выполнена успешно».

Связанный контент