dd
jest przeznaczony do blokowania - jest to zwykle najlepsze narzędzie do Twojej dyspozycji do odczytu ze zmiennych danych wejściowych, jeśli potrzebujesz tego natychmiast, ponieważ dd
nie buforuje bieżących odczytów w przyszłości write()
(chyba że bardzo wyraźnie skonfigurujesz to w ten sposób z większym obsłem niż ibs) , ale zamiast write()
wszystko to brzmi tak szybko, jak read()
to wszystko (i ewentualnie przetwarza je) .
Oto kilka ważnych definicji :
ibs=
expr
- Określ rozmiar bloku wejściowego, w bajtach, do (domyślnie 512) .
expr
obs=
expr
- Określ rozmiar bloku wyjściowego, w bajtach, do (domyślnie 512) .
expr
bs=
expr
- Ustaw rozmiar bloku wejściowego i wyjściowego na
expr
bajty, zastępując ibs=
i obs=
. Jeśli konwersja nie inna niż sync
, noerror
i notrunc
jest określona, każdy blok wejściowy zostanie skopiowany na wyjście jako pojedynczy blok bez agregacji krótkie bloki.
Widzisz więc, kiedy ibs
i obs
są zdefiniowane razem, ponieważ bs
wtedy ibs
ma pierwszeństwo - ale w przeciwnym razie, jeśli jesteś konkretny, to albo obs
albo cbs
.
Oto przykład, w którym ibs
jest najważniejszy. Możesz zrobić coś takiego, jeśli chcesz śledzić, jak szybko /dev/random
basen się zapełni ...
dd "ibs=$size" conv=sync "count=$lmt" \
if=/dev/random of="$somefile"
Dopóki if=
„s celem jest czytelny w ogóle, że będzie zawsze prowadzić w tej samej wielkości pliku wynikowego, ponieważ dd
będzie sync
hronize bloki odczytu w na null. Innymi słowy, jeśli dd
read()
s dla wejściowego bloku $((size=10))
$((count=5))
czasów, a read()
plik zwraca 2 bajty, to 8 bajtów, następnie 12 bajtów, następnie 2 bajty, a następnie 4 bajty, dd
zapisze w swoim pliku wyjściowym coś w rodzaju
2 read bytes 8NULs \
8 read bytes 2NULs \
10 read bytes 0NULs \
4 read bytes 6NULs \
4 read bytes 6NULs
... ponieważ dd
domyślnie nie opóźnia. Jeśli więc chcesz śledzić in-stream i ograniczyć zapisy innego procesu, dd
to jest to narzędzie dla Ciebie.
Jeśli po prostu zapisujesz pewną ilość danych do zwykłego pliku, w przeciwieństwie do innych oświadczeń tutaj zawartych, możesz również użyć dd
do tego - i dość łatwo - ale potrzebujesz więcej niż jednego i niezawodnego czynnika blokującego .
Na przykład, jeśli zrobiłeś:
{ dd ibs="$size" obs="${size}x$block_factor" |
dd bs="${size}x$blockfactor" "count=$lmt"
} <infile >outfile
... pierwszy dd
buforowałby tyle ibs="$size"
bloków wejściowych, ile było niezbędnych do wypełnienia co najmniej jednego obs="${size}x$block_factor"
bloku wyjściowego dla każdego write()
potoku między nim a drugim dd
. Oznacza to, że drugi dd
może niezawodnie ograniczyć moc wyjściową, count="$lmt"
ponieważ wszystkie write()
pierwsze marki będą pasować do swojego rozmiaru bloku we / wy - niezależnie od tego, ile read()
s dd
musi zrobić pierwszy .
W ten sposób możesz dd
niezawodnie czytać potoki lub inne typy plików specjalnych - z odrobiną matematyki.
/dev/random
zablokuje się, jeśli nie będzie wystarczającej ilości entropii do wygenerowania żądanej liczby cyfr. po prostu potrzeba czasu, aby zebrać tyle wysokiej jakości losowej „losowości” psuedo ... Albo użyj/dev/urandom
mniej losowej „losowej” wartości, albo sprawdź pulę entropii (w pętli i poczekaj w razie potrzeby) ...