передача dd skip|seek смещение как шестнадцатеричное

Ну, от вершины (родитель arndell, claremont, и monte) каталоги Вы могли ввести:

ls */*/{weekly,daily}

Который расширяется до:

ls */*/weekly */*/daily

Который показал бы Вам содержание весь weekly и daily каталоги.

10
27.11.2019, 09:33
2 ответа

Почему вторая команда производит другое значение?

По историческим причинам, dd рассматривает x быть оператором умножения. Так 0x3 оценен, чтобы быть 0.

Действительно ли возможно передать смещение skip|seek dd как шестнадцатеричное значение?

Не непосредственно, насколько я знаю. А также умножение с помощью оператора x, можно снабдить суффиксом любое число b для значения "умножаются на 512" (0x200) и с K для значения "умножаются на 1 024" (0x400). С GNU dd Вы может также использовать суффиксы M, G, T, P, E, Z и Y для значения умножаются на 2 к питанию 20, 30, 40, 50, 60, 70, 80 или 90, соответственно, и можно использовать верхний регистр или нижний регистр за исключением b суффикс. (Существует много других возможных суффиксов. Например, EB означает, "умножаются на 1 018" и PiB означает, "умножаются на 250". Посмотрите info coreutils "block size" для получения дополнительной информации, если у Вас есть установка GNU.)

Вы могли бы найти вышеупомянутое тайным, анахроничным, и гиковским на грани нелепости. Не волноваться: Вы не являетесь одними. К счастью, можно просто проигнорировать все это и использовать арифметическую замену оболочки вместо этого (удар и другой Posix, совместимые оболочки будут работать, а также некоторые оболочки non-Posix). Оболочка действительно понимает шестнадцатеричные числа, и она позволяет полный спектр арифметических операторов, записанных нормальным способом. Просто необходимо окружить выражение $((...)):

# dd if=2013-Aug-uptime.csv bs=1 count=$((0x2B * 1024)) skip=$((0x37))
18
27.01.2020, 20:01
  • 1
    Отметьте это $((...)) расширение арифметики POSIX, это не удар, конкретный вообще, Вы не должны использовать bash для использования его любая оболочка POSIX сделает. Однако обратите внимание на это во многих оболочках включая bash, это подвергается слову, разделяющему, так должен быть заключен в кавычки. –  Stéphane Chazelas 05.08.2013, 10:08
  • 2
    @StephaneChazelas: Это правда это не конкретный удар. Однако этому не нужны кавычки. (Posix: "Выражение нужно рассматривать, как будто это было в двойных кавычках, за исключением того, что двойную кавычку в выражении не рассматривают особенно".), Если бы была переменная в выражении и его значение, включал разделитель, то это не был бы верный номер; помещение кавычек вокруг $((...)) ничего не изменит. Единственный случай, о котором я могу думать, где кавычки сделали бы что-либо, - то, если у Вас было что-то как IFS=4 но это вызвало бы все виды другого хаоса. –  rici 06.08.2013, 03:00
  • 3
    Раздел, который Вы заключаете в кавычки, о том, что внутри $((...)). POSIX ясен что расширение $((...)) подвергается разделению слова. Отъезд любого из расширений команды/арифметики/переменной, закрывших кавычки в контексте списка, является split+glob оператором. Установка IFS=4 не вызвала бы все виды проблем, если Вы не используете split+glob оператор, где это - не нужный/, требуемый, и установило IFS каждый раз, когда Вам нужно это split+glob оператор. –  Stéphane Chazelas 06.08.2013, 21:07
  • 4
    @StephaneChazelas: да, числовой результат подвергается разделению слова. Но это - целое число. Если Вы устанавливаете IFS к чему-то, что включает цифры, что-то, которое я не полагаю, что когда-либо делал, затем необходимо было бы заключить в кавычки. По-видимому, если бы Вы делали это, то можно было бы знать о потребности, так как это - едва что-то, что, вероятно, сделает небрежно. Или по крайней мере, это - едва что-то, что я, вероятно, сделаю, период. Я не означаю говорить за Вас. –  rici 06.08.2013, 21:43

Я знаю, что это старая ветка, но проблема по-прежнему актуальна, как никогда, особенно когда такие идиоты, как я, случайно вспоминают и извлекают «cp fileA fileB» из истории bash, когда fileB еще не проверен -в git без резервной копии и содержит несколько часов кодирования после всего -nighter :-/

Благодаря концепциям, изложенным в этой теме, я смог полностью восстановить свой потерянный файл, однако я потерял свой на удаленном виртуальном частном сервере с 32-гигабайтным диском и очень небольшим объемом оперативной памяти (под управлением Ubuntu 18.04 ), и все мои попытки использовать «grep», как указано выше, быстро заканчивались «недостаточно памяти»

В моем случае это был hexdump -C /dev/sdX1 | grep 'shortString', который пришел мне на помощь. В отличие от grep, он отображает только очень узкое ASCII-представление шестнадцатеричного кода, поэтому очень важно искать только короткую уникальную строку и иметь в виду, что даже она может быть обернута. Как только он вывел какой-то шестнадцатеричный адрес, где было совпадение, я смог использовать «дд» аналогично тому, как описано выше, за исключением того, что я обнаружил, что по умолчанию размер блока равен 4096, поэтому мне пришлось не только преобразовать адрес шестнадцатеричных байтов в десятичный, но разделить его на 4096, чтобы масштабировать его до блоков 4 КБ для параметра пропуска -dd, что бесполезно, если это число слишком велико для dd, сообщение об ошибке выглядит так, как будто оно жалуется на то, что skip=недействителен, а не номер перешел к нему.

Престижность людям, которые добавили советы по использованию bash с $((0xabcd))в easilty obtaion hex ->dec конвертация:-)

Только последнее слово. -В моем случае было несколько копий одного и того же файла, и все они находились в непосредственной близости друг от друга. Но, вычитая самый низкий адрес из самого высокого адреса, сообщенного hexdump, я смог идентифицировать ~5-мегабайтную область, содержащую все возможные копии, что означало, что я мог выбрать dd по самому низкому адресу и извлечь всю эту область во временный файл. Редактор Vim теперь довольно изящно обрабатывает двоичный контент, поэтому вы можете затем изучить временный файл и изменить его форму по мере необходимости.

0
27.01.2020, 20:01

Теги

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