Na aparência, dd
é uma ferramenta de um sistema operacional da IBM que retém sua aparência estrangeira (sua passagem de parâmetro), que executa algumas funções muito raramente usadas (como conversões de EBCDIC para ASCII ou reversão de endianness ... não uma necessidade comum hoje em dia).
Eu achavam que dd
era mais rápido para copiar grandes blocos de dados no mesmo disco (devido ao uso mais eficiente do buffer), mas isso não é verdade , pelo menos nos sistemas Linux de hoje.
Acho que algumas das opções de dd
são úteis ao lidar com fitas, onde a leitura é realmente realizada em blocos (drivers de fita não escondem os blocos no meio de armazenamento como os drivers de disco fazem). Mas eu não sei os detalhes.
Uma coisa que o dd
pode fazer que não pode (facilmente) ser feito por qualquer outra ferramenta POSIX é tomando os primeiros N bytes de um fluxo. Muitos sistemas podem fazê-lo com head -c 42
, mas head -c
, embora seja comum, não está em POSIX (e não está disponível hoje, por exemplo, no OpenBSD). ( tail -c
é POSIX.) Além disso, mesmo onde head -c
existe, ele pode ler muitos bytes da origem (porque ele usa stdio buffering internamente), o que é um problema se você estiver lendo de um arquivo especial onde apenas a leitura tem um efeito. (Coreutils GNU atuais lêem a contagem exata com head -c
, mas o FreeBSD e o NetBSD usam o stdio.)
Mais geralmente, dd
fornece uma interface à API de arquivo subjacente que é única entre as ferramentas do Unix: somente dd
pode substituir ou truncar um arquivo em qualquer ponto ou procura em um arquivo. (Esta é a habilidade única de dd
, e é uma grande habilidade; por incrível que pareça, dd
é mais conhecido por coisas que outras ferramentas podem fazer.)
- A maioria das ferramentas Unix sobrescrevem o arquivo de saída, ou seja, apagam seu conteúdo e o iniciam do zero. É o que acontece quando você usa o redirecionamento
>
no shell também. - Você pode acrescentar ao conteúdo de um arquivo com
>>
de redirecionamento no shell ou comtee -a
. -
Se você quiser encurtar um arquivo removendo todos os dados após um certo ponto , isso é suportado pelo kernel subjacente e pela API C através do
truncate
funcionam, mas não são expostos por nenhuma ferramenta de linha de comando excetodd
:dd if=/dev/null of=/file/to/truncate seek=1 bs=123456 # truncate file to 123456 bytes
-
Se você quiser substituir os dados no meio de um arquivo, novamente, isso é possível na API do underyling por abrindo o arquivo para escrever sem truncar (e chamando
lseek
para mover para a posição desejada, se necessário), mas somentedd
pode abrir um arquivo sem truncar ou acrescentar, ou procura a partir do shell ( exemplo mais complexo ).# zero out the second kB block in the file (i.e. bytes 1024 to 2047) dd if=/dev/zero of=/path/to/file bs=1024 seek=1 count=1 conv=notrunc
Então… Como uma ferramenta do sistema, dd
é praticamente inútil. Como uma ferramenta de processamento de texto (ou arquivo binário), é muito valiosa!