Відповіді:
Чому друга команда видає інше значення?
З історичних причин dd
вважає x
оператором множення. Так 0x3
оцінюється як 0.
Чи можливо передати пропуск | шукати зміщення до dd як шістнадцяткове значення?
Не безпосередньо, наскільки я знаю. Окрім множення за допомогою оператора x
, ви можете суфіксувати будь-яке число b
на значення "помножити на 512" (0x200) та K
"помножити на 1024" (0x400). З ГНУ д.д. ви можете також використовувати суфікси M
, G
, T
, P
, E
, Z
і Y
означає помножити на 2 певною мірою 20, 30, 40, 50, 60, 70, 80 або 90, відповідно, і ви можете використовувати верхній або нижній регістр , за винятком для b
суфікса. (Є багато інших можливих суфіксів. Наприклад, EB
означає "помножити на 10 18 " і PiB
означає "помножити на 2 50 ". Додаткову info coreutils "block size"
інформацію див., Якщо у вас установка GNU.)
Ви можете виявити вищезгадане таємниче, анахронічне та прискіпливе до абсурду. Не хвилюйтеся: ви не самотні. На щастя, ви можете просто проігнорувати все це і використовувати замість арифметичної заміни вашої оболонки (працюватимуть bash та інші сумісні з Posix оболонки, а також деякі не-Posix-оболонки). Оболонка розуміє шістнадцяткові числа, і це дозволяє повний спектр арифметичних операторів, записаних звичайним чином. Вам просто потрібно оточити вираз за допомогою $((...))
:
# dd if=2013-Aug-uptime.csv bs=1 count=$((0x2B * 1024)) skip=$((0x37))
$((...))
нічого не змінить. Єдиний випадок, коли я можу придумати, де цитати могли б зробити що-небудь, - якби у вас було щось подібне, IFS=4
але це спричинило б усілякий інший хаос.
$((...))
. POSIX зрозуміло, що розширення $((...))
підлягає поділу слів . Залишаючи будь-яке з команд / арифметичних / змінних розширень без котирування у контексті списку - це оператор split + glob. Встановлення IFS = 4 не спричинить усілякі проблеми, якщо ви не використовуєте оператор split + glob там, де він не потрібен / шуканий, і встановлювати IFS кожен раз, коли вам потрібен цей оператор split + glob.
IFS
щось, що включає цифри, те, що я не вірю, що я коли-небудь робив, то вам потрібно буде цитувати. Імовірно, якби хтось робив це, хтось би усвідомлював необхідність, оскільки навряд чи це можна зробити випадково. Або, принаймні, це навряд чи щось, що я, мабуть, робитиму. Я не хочу говорити за тебе.
Я знаю, що це стара тема, але ця проблема як і раніше актуальна, особливо коли ідіоти, такі як я, мимоволі згадують і виправдовують файл cp fileA fileB з історії башів, коли fileB ще не зареєстрований, щоб git не створив резервну копію вгору і містять кілька годин кодування після всебічного: - /
Завдяки концепціям у цій темі, я зміг повністю відновити втрачений файл, проте я втратив шахту на віддаленому віртуальному приватному сервері з 32 Гбітним диском і дуже мало оперативної пам’яті (працює на Ubuntu 18.04), і всі мої спроби, використовуючи 'grep' як вище швидко вмирає з "недостатньою пам'яттю"
У моєму випадку саме hexdump -C /dev/sdX1 | grep 'shortString'
мені допомогли. На відміну від grep, він відображає лише дуже вузьке ASCII зображення шестигранника, тому важливо лише шукати короткий унікальний рядок і мати на увазі, що навіть це можна обернути. Після того, як він видав якусь шістнадцяткову адресу, де була відповідність, я зміг використовувати 'dd' аналогічним чином, як вище, за винятком того, що я виявив, що він здається дефолтним до розміру блоку 4096, тому мені не тільки довелося перетворіть шістнадцяткову байтову адресу в десяткову, але поділіть її на 4096, щоб її масштабувати до 4-х блоків для параметра пропуску ДД - безпомилково, якщо це число занадто велике для dd, повідомлення про помилку виглядає так, що воно скаржиться на skip=
недійсне, а не на число, передане йому .
Кудо людям, які додали поради щодо використання bash з $((0xabcd))
hex-> dec конвертацією :-)
Лише моє остаточне слово - У моєму випадку було кілька копій одного і того ж файлу, які знаходились у безпосередній близькості. Але віднявши найнижчу адресу від найвищої адреси, про яку повідомляв hexdump, я зміг виявити область ~ 5 МБ, що містить усі можливі копії, що означало, що я можу націлити DD на найнижчу адресу і витягнути всю цю область до тимчасового файлу. Тепер редактор Vim обробляє двійковий вміст досить витончено, тож ви зможете вивчити тимчасовий файл і змінити його за потребою.
$((...))
це арифметичне розширення POSIX, воно зовсім не конкретно, не потрібноbash
використовувати його, будь-яка оболонка POSIX буде робити. Однак зауважте, що у багатьох оболонках, у тому числіbash
, воно зазнає розщеплення слів, тому його слід цитувати.