Por que o segundo comando gera um valor diferente?
Por razões históricas, dd
considera x
ser um operador de multiplicação. Portanto, 0x3
é avaliado como 0.
É possível passar o deslocamento skip | seek para dd como um valor hexadecimal?
Não diretamente, tanto quanto eu sei. Além da multiplicação usando o operador x
, você pode sufocar qualquer número com o b
significado de "multiplicar por 512" (0x200) e com o K
significado de "multiplicar por 1024" (0x400). Com GNU dd pode também utilizar sufixos de M
, G
, T
, P
, E
, Z
e Y
para significar multiplicar por 2 à potência de 20, 30, 40, 50, 60, 70, 80 ou 90, respectivamente, e pode usar superior ou inferior caso excepto para o b
sufixo. (Existem muitos outros sufixos possíveis. Por exemplo, EB
significa "multiplicar por 10 18 " e PiB
significa "multiplicar por 2 50 ". Consulte info coreutils "block size"
para obter mais informações, se você tiver uma instalação GNU.)
Você pode achar o arcano acima, anacrônico e nerd ao ponto do absurdo. Não se preocupe: você não está sozinho. Felizmente, você pode simplesmente ignorar tudo e usar a substituição aritmética do seu shell (o bash e outros shells compatíveis com Posix funcionarão, bem como alguns shells não Posix). O shell entende números hexadecimais e permite uma gama completa de operadores aritméticos escritos da maneira normal. Você só precisa cercar a expressão com $((...))
:
# dd if=2013-Aug-uptime.csv bs=1 count=$((0x2B * 1024)) skip=$((0x37))
$((...))
expansão aritmética do POSIX não é específica para o bash, você não precisa usábash
-lo, qualquer shell POSIX o fará. No entanto, note que em muitos reservatóriosbash
, inclusive , ele sofre divisão de palavras, portanto, deve ser citado.$((...))
não mudará nada. O único caso em que consigo pensar em onde as aspas fariam alguma coisa é se você tivesse algo assim,IFS=4
mas isso causaria todo tipo de caos.$((...))
. O POSIX é claro que a expansão de$((...))
está sujeita à divisão de palavras . Deixando qualquer uma das expansões de comando / aritmética / variável não citadas no contexto da lista é o operador split + glob. Definir IFS = 4 não causaria todos os tipos de problemas se você não usar o operador split + glob onde não é necessário / desejado e defina o IFS toda vez que precisar desse operador split + glob.IFS
algo que inclua dígitos, algo que eu não acredito que já tenha feito, será necessário citar. Presumivelmente, se alguém estivesse fazendo isso, estaria ciente da necessidade, já que dificilmente é algo que provavelmente fará casualmente. Ou, pelo menos, dificilmente é algo que provavelmente vou fazer, ponto final. Eu não pretendo falar por você.Eu sei que esse é um tópico antigo, mas o problema ainda é mais relevante do que nunca, especialmente quando idiotas como eu vão e inadvertidamente lembram e extraem um 'arquivo cp fileA fileB' do histórico do bash quando o fileB ainda não está registrado no git sem suporte e contendo várias horas de codificação após uma noite toda: - /
Graças aos conceitos deste segmento, eu consegui recuperar completamente o meu arquivo perdido, mas perdi o meu em um servidor privado virtual remoto com um disco de 32Gb e muito pouca memória RAM (executando o Ubuntu 18.04), e todas as minhas tentativas usando 'grep' como acima morreria rapidamente com 'memória insuficiente'
No meu caso, foi o
hexdump -C /dev/sdX1 | grep 'shortString'
que veio em meu socorro. Ao contrário do grep, ele exibe apenas uma representação ASCII muito hexadecimal do hex, por isso é vital procurar apenas uma sequência curta e única, e lembre-se de que mesmo isso pode ser resolvido. Depois que ele emitiu algum endereço hexadecimal em que houve uma correspondência, eu pude usar 'dd' de uma maneira semelhante à anterior, exceto que eu achei que parecia estar padronizando para um tamanho de bloco de 4096, então eu não tinha apenas que converta o endereço de bytes hexadecimais em decimal, mas divida-o por 4096 para escalá-lo em blocos de 4k para o parâmetro skip do dd - sem ajuda, se esse número for muito grande para dd, a mensagem de erro parece estar reclamando porskip=
ser inválida, e não pelo número passado a ele .Muitos elogios para as pessoas que adicionaram dicas sobre o uso do bash com
$((0xabcd))
a facilidade de conversão obtaion hex-> dec :-)Apenas minha palavra final - No meu caso, havia várias cópias do mesmo arquivo, todas próximas. Mas, subtraindo o endereço mais baixo do endereço mais alto relatado pelo hexdump, consegui identificar uma região de ~ 5 MB contendo todas as cópias possíveis, o que significava que eu poderia direcionar o dd para o endereço mais baixo e extrair toda a região para um arquivo temporário. O editor Vim agora lida com conteúdo binário de maneira bastante simples, para que você possa examinar o arquivo temporário e remodelá-lo conforme necessário.
fonte