Как сделать что-то вроде dd if=somefile bs=1 skip=1337 count=31337000
, но эффективно, не используя не 1-байтовое чтение и запись?
Ожидается решение:
- Чтобы быть простым (для непростых я могу написать некоторый Perl oneliner, который сделает это)
- Поддерживать большие смещения и длины (так что хаки с размером блока в dd не помогут)
Частичное решение (не достаточно простое, попытка того же самого с длиной сделает его еще более сложным):
dd if=somefile bs=1000 skip=1 count=31337 | { dd bs=337 count=1 of=/dev/null; rest_of_pipeline; }
# 1337 div 1000 and 1337 mod 1000
Ответы:
Это должно сделать это (на GNU DD):
В случае, если вы используете
seek=
, вы также можете рассмотретьoflag=seek_bytes
.От
info dd
:PS: Я понимаю, что этот вопрос старый, и кажется, что эти флаги были реализованы после того, как вопрос был задан изначально, но, поскольку это один из первых результатов поиска в Google по связанному поиску dd, который я сделал, я подумал, что было бы неплохо обновить его новыми характерная черта.
источник
Используйте один процесс, чтобы отбросить все начальные байты, затем секунду, чтобы прочитать фактические байты, например:
Второй
dd
может читать входные данные с любым размером блока, который вы считаете эффективным. Обратите внимание, что для этого требуется дополнительный процесс; в зависимости от вашей ОС это будет стоить, но, вероятно, будет меньше, чем необходимость считывать файлы один за другим (если у вас нет очень маленького файла, в этом случае проблем не будет).источник
dd if=/dev/sda bs=10000000001 | dd bs=255 count=1 | hd
-> «ДД: недействительный номер« 10000000001 »»dd if=/dev/sda bs=16M skip=596 count=1 | dd bs=512 skip=1522 count=1 | (dd bs=1 count=1 of=/dev/null ; dd bs=255 count=1)
read -n
чтобы пропустить? А потомhead -c
считать? Например,cat somefile | (read -n 1337; head -c 31337000)
вы могли бы сделать это, не вызывая дополнительного процесса:exec 3<somefile; read -n 1337 -u 3; head -c 31337000 <&3
Вместо
bs=1
использованияbs=4096
или больше.источник
f.seek(1337)
перед использованиемread(MY_CHUNK_SIZE)
Вы можете попробовать команду hexdump:
Если вы просто хотите увидеть содержимое:
источник