Я не знаю, зачем тебе эта штуковина; может быть для целей обучения. Хорошо, вот более сложное устройство:
#!/bin/bash block_size=1048576 # must be a plain number, without any suffix count=0 while true do retbytes=`dd if=./file.txt bs=$block_size skip=$count count=1 status=none | tee >(dd of=other.txt bs=$block_size seek=$count status=none) | wc -c` [ "$retbytes" -eq "$block_size" ] || break count=$((count + 1)) done
Ваш оригинальный скрипт использует sh
и [[
. Это не работает В моей версии [
достаточно, где мне это нужно ( sh
понял бы это), но мне bash
все равно нужно из-за >(…)
синтаксиса в другом месте.
Возможно, вы не заметили, но ваш сценарий обрабатывает все file.txt
в первом проходе, потому что вы не сказали dd
останавливаться после первого фрагмента. (Примечание dd
делает это порциями, т. Е. Единственный первый dd
запуск, который вы выполняете, делает то, что вы хотите, чтобы весь ваш скрипт делал). Позже в цикле последовательные dd
-s снова и снова перезаписывают (потому что пропускают все больше и больше); каждый раз до конца file.txt
хотя. Они работают совершенно бесполезно (если входной файл не изменится за это время). Я думаю, что ваше намерение было то, что count=1
делает.
Вот как работает мой скрипт:
- Он использует отдельные
dd
-s для чтения и записи. tee
разветвляется вывод чтенияdd
. Один экземпляр отправляется на записьdd
.- К тем же данным попадает
wc -c
, этот инструмент сообщает количество полученных байтов. - Цикл завершается, если это число не соответствует размеру нашего блока.
Примечание $block_size
должно быть в формате, который позволяет сравнение с выводом wc
. Следовательно, это должно быть простое число без суффикса, несмотря на то, что он способен dd
понять некоторые из bs=
возможных вариантов.