Что означают два числа соответственно в статистике dd «a + b записей»?

В первую очередь: если Вы собираетесь быть использованием решений для попытки полная копия или копия подмножества изображений для предотвращения аварии.

Вы могли попробовать что-то вроде:

for folder in $(ls -l | awk '{print $9}'); 
    do <magic here>;
done

Волшебство могло быть чем-то как использование identify управляйте, доступно ли это Вам. Из того, что я читал, это может считать exif данные из изображений. На основе этого Вы могли, возможно, создать папку или переместить каталог и т.д. и т.д.

16
25.10.2015, 20:03
3 ответа

Это означает полные блоки размера bs плюс дополнительные блоки с размером меньше bs.

pushd "$(mktemp -d)"
dd if=/dev/zero of=1 bs=64M count=1 # and you get a 1+0
dd if=1 of=/dev/null bs=16M # 4+0
dd if=1 of=/dev/null bs=20M # 3+1
dd if=1 of=/dev/null bs=80M # 0+1
_crap=$PWD; popd; rm -rf "$_crap"; unset _crap
# frostschutz's case
yes | dd of=/dev/null bs=64M count=1 # 0+1

Edit: в ответе frostschutz упоминается другой случай генерации неполных блоков. Стоит прочитать. See also https://unix.stackexchange.com/a/17357/73443.

16
27.01.2020, 19:48

Есть десятки стандартных утилит командной строки, которые могут зависать на дескрипторе и ждать ввода. Все они работают примерно так. dd уникален тем, что может показать вам, как выглядит дескриптор прямо сейчас .

Лично я не совсем понимаю полезность опции GNU iflag = fullblock . Я имею в виду, что вы можете просто cat ввести свой ввод с такой же легкостью, не беспокоясь о размерах блоков ввода-вывода.

Но dd может принимать часть потока - и он может делать это в read () / write () границы относительно современной системы.

{ (     sleep 1                     #don't write() til dd is definitely setup
        printf 123                  #write() 3  bytes
        printf %-30s\\n 456         #write() 31 bytes
        printf you\ there\?         #write() 10 bytes
)|      dd bs=64 count=2 conv=sync| #2 64 byte read()/write() \0-padded blocks
        od -vtc                     #show it with octal radices
}       2>/dev/null                 #drop stderr

0000000   1   2   3  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000020  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000040  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000060  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000100   4   5   6
0000120                                                          \n  \0
0000140  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000160  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000200

dd выполняет одно read () для каждого входного блока. Если файл, который он пытается read () , не содержит столько данных, сколько он запросил, это не имеет значения - один read () считается один блок ввода. Вот как это работает - это основная утилита dd .

Когда он выполнил свою работу, dd сообщает обо всех блоках ввода / вывода, с которыми он имел дело. Выполнение вышеуказанной команды снова, но на этот раз вместо stdout ...


dd: warning: partial read (3 bytes); suggest iflag=fullblock
0+2 records in
2+0 records out
128 bytes (128 B) copied, 1.00161 s, 0.1 kB/s

Каждый раз, когда dd делал read (0, & in, 64), read возвращался короткое - потому что в его дескрипторе файла stdin не хватило байтов, ожидающих выполнения своего запроса, когда он его сделал. Итак, dd read () 0 полных входных записей и 2 коротких. Вот что означают эти отчеты.

4
27.01.2020, 19:48

Это («enable -n») является свойством bash-specific . Можно поместить

enable -n echo

в соответствующий сценарий инициализации оболочки, например, ~/.bashrc , чтобы это повлияло на каждую вызываемую оболочку.

-121--289251-

Это означает полные блоки с размером bs плюс дополнительные блоки с размером меньше bs.

pushd "$(mktemp -d)"
dd if=/dev/zero of=1 bs=64M count=1 # and you get a 1+0
dd if=1 of=/dev/null bs=16M # 4+0
dd if=1 of=/dev/null bs=20M # 3+1
dd if=1 of=/dev/null bs=80M # 0+1
_crap=$PWD; popd; rm -rf "$_crap"; unset _crap
# frostschutz's case
yes | dd of=/dev/null bs=64M count=1 # 0+1

Изменить : в ответе frostschutz упоминается другой случай, чтобы создать неполные блоки. Стоит прочитать. См. также https://unix.stackexchange.com/a/17357/73443 .

-121--27054-

0 + b записи для b > 1 обычно являются неполными при чтении из канала или другого источника, который не может предоставить bs = X данных достаточно быстро. Можно заставить dd ждать полных блоков данных, используя iflag = fullblock . Этот параметр особенно полезен, если вы также используете count = X , так как count также считает неполные блоки, так что это ненадежно без fullblock...

10
27.01.2020, 19:48

Теги

Похожие вопросы