При большем размере блока существует риск получения неполных чтений. Это также часто происходит при чтении из канала, а не из блочного устройства.
Если вы ожидаете получить определенный размер (count
*bs
), вы также должны указать iflag=fullblock
.
Это может быть необязательно для bs=1M
или меньшего размера, но в любом случае рекомендуется.
dd
также попытается показать вам, сколько неполных чтений он получил. Копирует n+m
блоков, n полных и m неполных. При копировании файлов, не кратных размеру блока, последний блок может быть неполным.
Пример:
$ dd status=progress if=/dev/urandom of=/dev/null bs=100M count=20
dd: warning: partial read (33554431 bytes); suggest iflag=fullblock
536870896 bytes (537 MB, 512 MiB) copied, 2 s, 254 MB/s
0+20 records in
0+20 records out
671088620 bytes (671 MB, 640 MiB) copied, 2.64391 s, 254 MB/s
В этом случае были получены только неполные чтения и ни одного полного 100-мегапиксельного блока. Очевидно, что /dev/urandom не хочет обрабатывать столько данных за одно чтение. Моя версия dd даже говорит вам использовать iflag=fullbock
напрямую.
С фуллблоком все ок:
$ dd status=progress if=/dev/urandom of=/dev/null bs=100M count=20 iflag=fullblock
2097152000 bytes (2.1 GB, 2.0 GiB) copied, 8 s, 255 MB/s
20+0 records in
20+0 records out
2097152000 bytes (2.1 GB, 2.0 GiB) copied, 8.22914 s, 255 MB/s
Это занимает больше времени, потому что на самом деле копируется в два раза больше данных.
RegEx не подходит для решения этой проблемы. Сказав это, что-то вот так может сработать:
112[1-9]|11[3-9][0-9]|1[2-9][0-9][0-9]|[2-9][0-9][0-9][0-9]