dd
copia exatamente count
blocos de bs
bytes, ou 2880 * 512 bytes no total, neste caso (mas veja abaixo) . Isso truncará ou preencherá a concatenação dos dois arquivos para um tamanho fixo (pois /dev/zero
fornece quantos bytes zero forem necessários). 1440 kB é parecido com o tamanho de um disquete de 3,5 "HD, então talvez alguém quisesse fazer imagens que encaixassem exatamente no disquete.
O cat
em seu segundo exemplo apenas concatenará os arquivos, e o resultado será de qualquer tamanho.
Exemplo menor:
$ echo hello > a; echo world > b
$ cat a b | od -c
0000000 h e l l o \n w o r l d \n
$ cat a b /dev/zero | dd bs=1 count=8 2>/dev/null | od -c
0000000 h e l l o \n w o
$ cat a b /dev/zero | dd bs=1 count=16 2>/dev/null | od -c
0000000 h e l l o \n w o r l d \n $ cat a b /dev/zero | head -c 16 ...
$ echo hello > a; echo world > b
$ cat a b | od -c
0000000 h e l l o \n w o r l d \n
$ cat a b /dev/zero | dd bs=1 count=8 2>/dev/null | od -c
0000000 h e l l o \n w o
$ cat a b /dev/zero | dd bs=1 count=16 2>/dev/null | od -c
0000000 h e l l o \n w o r l d \n $ cat a b /dev/zero | head -c 16 ...
%pre% %pre% %pre%
%pre% %pre%
Na verdade, dd
lerá e gravará menos se obtiver menos dados do que o tamanho de bloco em uma única chamada read()
. Isso pode acontecer com grandes tamanhos de bloco, mas provavelmente não é um problema com 512, pois cat
grava os dados em blocos de pelo menos esse tamanho. No GNU dd, isso pode ser evitado com iflag=fullblock
.
Poderíamos fazer o mesmo com head -c
: