Recentemente, percebi que podemos usar cat
tanto quanto dd
, e na verdade é mais rápido do quedd
Sei que isso dd
foi útil para lidar com fitas em que o tamanho do bloco realmente importava na correção, não apenas no desempenho. Nestes dias, porém, existem situações em que dd
podemos fazer algo cat
que não podemos? (Aqui consideraria irrelevante uma diferença de desempenho de menos de 20%.)
Exemplos concretos seriam legais!
Respostas:
Na aparência,
dd
é uma ferramenta de um sistema operacional IBM que mantém sua aparência externa (sua passagem de parâmetros), que executa algumas funções muito raramente usadas (como conversões EBCDIC para ASCII ou reversão de endianismo ... não é uma necessidade comum atualmente).Eu achava que
dd
era mais rápido 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 atuais.Eu acho que algumas das
dd
opções são úteis ao lidar com fitas, onde a leitura é realmente realizada em blocos (os drivers de fita não escondem os blocos no meio de armazenamento da mesma forma que os drivers de disco). Mas eu não sei os detalhes.Uma coisa
dd
que pode ser feita (facilmente) por qualquer outra ferramenta POSIX é obter os primeiros N bytes de um fluxo. Muitos sistemas podem fazer isso comhead -c 42
, mashead -c
, embora comuns, não estejam no POSIX (e não estão disponíveis hoje, por exemplo, no OpenBSD). (tail -c
é POSIX.) Além disso, mesmo ondehead -c
existe, ele pode ler muitos bytes da fonte (porque usa o buffer interno do stdio), o que é um problema se você estiver lendo um arquivo especial no qual apenas a leitura tem efeito. (Os coreutils atuais do GNU leem a contagem exata comhead -c
, mas o FreeBSD e o NetBSD usam o stdio.)De maneira mais geral,
dd
fornece uma interface para a API do arquivo subjacente, única entre as ferramentas do Unix: somentedd
pode sobrescrever ou truncar um arquivo a qualquer momento ou procurar em um arquivo. (Essa édd
a capacidade única e é grande; por incrível que pareça,dd
é mais conhecida pelas coisas que outras ferramentas podem fazer.)>
redirecionamento no shell.>>
redirecionamento no shell ou comtee -a
.Se você deseja reduzir um arquivo removendo todos os dados após um certo ponto , isso é suportado pelo kernel subjacente e pela API C por meio da
truncate
função, mas não exposto por nenhuma ferramenta de linha de comando, excetodd
:Se você deseja sobrescrever dados no meio de um arquivo, novamente, isso é possível na API de underyling, abrindo o arquivo para gravação sem truncar (e chamando
lseek
para mover para a posição desejada, se necessário), mas sódd
pode abrir um arquivo sem truncar ou anexar ou procurar no shell ( exemplo mais complexo ).Então ... Como ferramenta de sistema,
dd
é praticamente inútil. Como uma ferramenta de processamento de texto (ou arquivo binário), é bastante valiosa!fonte
trunc
e deseek
ser utilizáveldd
).dd
pode ler dados binários de descritores de arquivos não inseparáveis sem destruir potencialmente os dados não lidos devido ao buffer do stdio. Veja aqui um exemplo: etalabs.net/sh_tricks.htmlhead -c N
chamaread
e nunca vai além de N. No NetBSD 5.1,head -c
chamagetc
. No FreeBSD 7.4,head -c
chamafread
.dd
também expõe O_DIRECT (etc.) ao script de shell, que também acho único.truncate
permite truncar ou estender arquivos, eliminando assim outro uso dodd
.O
dd
comando inclui muitas opções que o gato não pode acomodar. Talvez em seus casos de uso, cat seja um substituto viável, mas não seja um substituto de dd.Um exemplo seria usar
dd
para copiar parte de algo, mas não a coisa toda. Talvez você queira extrair alguns bits do meio de uma imagem iso ou da tabela de partição de um disco rígido com base em um local conhecido no dispositivo. Comdd
você pode especificar as opções de início, parada e quantidade que permitem essas ações.Essas opções o
dd
tornam indispensável para manipulação de dados refinada, enquantocat
* só pode operar em objetos, dispositivos ou fluxos de arquivos inteiros.* Conforme observado por Gilles nos comentários, é possível combinar
cat
com outras ferramentas para isolar partes de algo, mascat
ainda opera em todo o objeto.fonte
dd
realmente não tem nada a ver com dispositivos de baixo nível, ele precisa de uma entrada/dev
como as outras. Você pode copiar uma partição inteira comcat
, ou parte dela comtail +c $(($start+1)) | head -c $count
.cat | head | tail
para buscar os últimos MBs, o disco giratório sugará a lua para mais perto da Terra.Ninguém mencionou ainda que você pode usar o dd para criar arquivos esparsos , embora
truncate
também possa ser usado para a mesma finalidade.Isso é quase instantâneo e cria um arquivo grande arbitrário que pode ser usado como um arquivo de loopback, por exemplo:
O bom é que, inicialmente, ele usa apenas um único bloco de espaço em disco e depois cresce apenas conforme necessário (a formatação ext4 de um arquivo de 10 GB consome 291 MB no meu sistema). Use
du
para ver quanto espaço em disco é realmente usado -ls
informa apenas o tamanho máximo para o qual o arquivo pode crescer.fonte
ls -ls
mostra o tamanho escasso.dd of=sparse-file bs=1 count=0 seek=10G
seria equivalente atruncate -s 10GB sparse-file
. Desconcertante suficiente,truncate
edd
tem interpretação exata opostoGB
vs.G
...man dd
diz:MB =1000*1000, M =1024*1024
e assim por diante. Eman truncate
diz:,MB 1000*1000, M 1024*1024
então não há diferença. Eu uso ambosdd
e atruncate
partir dos GNU coreutils. Você deveria fazer isso também! :-)Substituir segmentos específicos de um disco rígido por algo é um exemplo comum. Por exemplo, você pode excluir seu MBR usando este comando:
Além disso, você pode criar arquivos vazios com ele (por exemplo, para imagens de disco de loop):
fonte
head -c
? Por favor, compartilhe uma referência !dd
é muito útil para fazer backup do setor de inicialização de um disco rígido ou outro dispositivo de armazenamento (dd if=/dev/sda of=boot_sector.bin bs=512 count=1
) e depois reescrevê-lo (dd if=boot_sector.bin of=/dev/sda
). É igualmente útil para fazer backup dos cabeçalhos de volumes criptografados.cat
pode ser capaz de fazer isso, mas eu não confiaria na parte de reescrever. É difícil conseguircat
ler / gravar apenas um determinado número de bytes.fonte
Recentemente, tive motivos para clonar várias partições de 100s de GB pela primeira vez na minha história de linux (cf
cp -ar
oursync
que me serviram muitas vezes). Claro que me virei paradd
'porque todo mundo sabe que é isso que você usa ... e fiquei horrorizado com o desempenho. Um pouco de pesquisa no Google logo me levou addrescue
usá-lo algumas vezes agora e funciona muito bem (muito mais rápido que o dd).fonte
ddrescue
é ótimo, especialmente para obter dados de discos com falha.Aqui estão alguns truques que eu inventei ao longo dos anos.
Recortar e colar no modo tty ou não interativo hostil
Se você estiver em uma situação em que EOF / ^ D / ^ F não for detectado, use dd para transferir arquivos de texto para um host. Uma vez que ele irá parar de ler automaticamente após uma quantidade especificada de bytes.
Usei isso recentemente no ano passado, durante um exercício de segurança em que conseguimos obter shells não-tty em um host remoto e precisávamos transferir arquivos.
Na verdade, eu até criei alguns arquivos binários codificando-os em base64 e usando um script de decodificação de base64 lento, mas confiável.
Um truque super bacana é que, enquanto o dd estiver em execução, se você enviar um sinal USR1, ele emitirá seu status atual (bytes lidos, bytes por segundo ..)
Filtro de estado de rendimento universal
Eu escrevi isso para atuar como um filtro de progresso do bash puro para qualquer programa que emita dados através do stdout. (Nota: praticamente qualquer coisa emitirá dados através do stdout - para programas que não o fazem, você pode trapacear se eles não vomitarem usando o / dev / stdout como um nome de arquivo. Mas a idéia é basicamente, toda vez que você obtém o X quantidade de bytes, imprimir marcas de hash (como o FTP da velha escola quando o modo de hash estava ativado)
(Nota) A coisa do arquivo de progresso é esfarrapada, isso era principalmente uma prova de conceito. Se eu refizesse, usaria apenas uma variável.
arquivos de fatia e dados usando manipuladores de arquivos de shell anônimos
Aqui está um exemplo extremamente pseudo-código de como você pode ter um arquivo tar assinado que pode ser extraído sem erros, fornecendo entrada tar através de um tratamento de arquivos anônimo - sem usar nenhum arquivo tmp para armazenar dados parciais do arquivo.
O tl; dr é: acho que o dd é incrivelmente útil. E esses são apenas os três exemplos em que consigo pensar.
fonte
Você pode redirecionar algum conteúdo de saída. É particularmente útil se você precisar escrever com
sudo
:Além disso
sudo
, é equivalente a:ou para isso:
fonte