Лучший способ удалить байты из запуска файла?

Я обычно присоединяю strace к такому рабочему процессу (с -p $PID опция), чтобы видеть, остается ли это заблокированным в системном вызове или если это все еще активно.

Или, если Вы чувствуете себя озабоченными отправкой сигнала к выполнению dd, запустите другой dd, чтобы проверить, если это работает.

62
03.02.2011, 19:34
7 ответов

Можно переключить бакалавра наук и пропустить опции:

dd bs=1131 skip=1 if=filtered.dump of=trimmed.dump

Таким образом, операция может извлечь выгоду из большего блока.

Иначе Вы могли попробовать хвостом (хотя не безопасно использовать его с двоичными файлами):

tail -c +1132 filtered.dump >trimmed.dump

Наконец, можно использовать 3 dd экземпляра для записи чего-то вроде этого:

dd if=filtered.dump bs=512k | { dd bs=1131 count=1 of=/dev/null; dd bs=512k of=trimmed.dump; }

где первый dd печатает свой стандартный вывод filtered.dump; второй просто читает 1 131 байт и выбрасывает их; затем, последние чтения из его стандарта вводят остающиеся байты filtered.dump и пишут им в trimmed.dump.

64
27.01.2020, 19:32
  • 1
    Спасибо!, я не знал, что переданный по каналу вводят перенесенный на второй процесс как этот - это очень аккуратно. Я не могу полагать, что не думал bs=1131 skip=1 хотя :-/ –  Rup 04.02.2011, 02:35
  • 2
    Большинство современных реализаций утилит оболочки работает правильно с двоичными файлами (т.е. они не испытывают затруднений из-за нулевых символов и не вставят дополнительную новую строку в конце файла). Конечно, GNU и *реализации BSD безопасен. –  Gilles 'SO- stop being evil' 05.02.2011, 02:04

Можно использовать подоболочку и два dd вызовы как это:

$ ( dd bs=1131 count=1 of=dev_null && dd bs=4K of=out.mp3 ) < 100827_MR029_LobbyControl.mp3
1+0 records in
1+0 records out
1131 bytes (1.1 kB) copied, 7.9691e-05 s, 14.2 MB/s
22433+1 records in
22433+1 records out
91886130 bytes (92 MB) copied, 0.329823 s, 279 MB/s
$ ls -l *
-rw------- 1 max users 91887261 2011-02-03 22:59 100827_MR029_LobbyControl.mp3
-rw-r--r-- 1 max users     1131 2011-02-03 23:04 dev_null
-rw-r--r-- 1 max users 91886130 2011-02-03 23:04 out.mp3
$ cat dev_null out.mp3 > orig
$ cmp 100827_MR029_LobbyControl.mp3 orig
15
27.01.2020, 19:32
  • 1
    Благодарит - я не знал переданный по каналу, вводят продолженный к второму процессу как этот, я предполагаю, что это - оболочка sub? Я буду определенно помнить это! Я дал Marco галочку, потому что он стал здесь первым, но +1 и спасибо за ответ! дамп содержимого диска –  Rup 04.02.2011, 02:36
  • 2
    @Rup запросов памяти, да, подоболочка - созданный через круглые скобки - обеспечивает stdin дескриптор файла и обоих, какие вызовы dd последовательно используют вход от него. Да - Marco победил меня на 29 секунд :) –  maxschlepzig 04.02.2011, 10:23

Еще один способ удалить ведущие байты из файла (без использования dd вообще), должен использовать xxd и sed или tail соответственно.

bytes=$((1131*2))

xxd -p -c 256 filtered.dump | tr -d '\n' | sed "s/^.\{0,${bytes}\}//" | xxd -r -p > trimmed.dump

bytes=$((bytes + 1)) 
xxd -p -c 256 filtered.dump | tr -d '\n' | tail -c +${bytes} | xxd -r -p > trimmed.dump
2
27.01.2020, 19:32
  • 1
    Это аккуратно, но я думаю, что предпочитаю просто работать с файлом в двоичном файле вместо того, чтобы преобразовать его в и от шестнадцатеричного числа. –  Rup 15.04.2013, 17:56
[116427]@maxschlepzig запрашивает онлайн лайнер. Вот один в перле. Требуется 2 аргумента: От байта и длины. Входной файл должен быть задан с помощью '<' и вывод будет на stdout:

Если длина файла больше, то будет скопирована остальная часть файла.

scp my_log-bin.0139[3-9][0-9] root@192.168.103.66:/backup/
В моей системе это дает 3.5 Гб/с.[116432].
2
27.01.2020, 19:32
[1130354] Не уверен, когда был добавлен [1130810]skip_bytes[1130811], но чтобы пропустить первые 11 байт, которые у вас есть: [12216] Где [1130812]iflag=skip_bytes[1130813] говорит dd интерпретировать значение для опции [1130814] skip[1130815] как байты, а не как блоки, что упрощает задачу.[1130357]
20
27.01.2020, 19:32

, если файловая система и Ядра Linux поддерживает его, тогда вы можете попробовать Fortocate Если вы хотите внести изменения в помещении: в лучшем случае нет данных IO вообще:

$ fallocate <magic> -o 0 -l 1131 inplace.dump

где Зависит от файловой системы, версии Linux и типа файла ( falloc_fl_collapse_range или Falloc_fl_punch_size | falloc_fl_keep_size может использоваться внутри ).

7
27.01.2020, 19:32

Вы должны использовать count = 0 - это простой lseek () , когда это возможно.

Примерно так:

{  dd bs=1131 skip=1 count=0; cat; } <filtered.dump >trimmed.dump

dd будет lseek () дескриптор входного файла со смещением 1131 байт, а затем cat просто скопирует все, что осталось, для вывода.

3
27.01.2020, 19:32

Теги

Похожие вопросы