Я недавно понял, что мы можем использовать cat
столько, сколько dd
, и это на самом деле быстрее, чемdd
Я знаю, что это dd
было полезно при работе с лентами, где размер блока действительно имел значение в правильности, а не только в производительности. В наши дни, однако, бывают ситуации, когда dd
можно что-то сделать, а что cat
нет? (Здесь я бы посчитал разницу в производительности менее 20% несущественной.)
Конкретные примеры были бы хороши!
Ответы:
По внешнему виду,
dd
это инструмент из операционной системы IBM, который сохранил свой внешний вид (передачу параметров), который выполняет некоторые очень редко используемые функции (такие как преобразования EBCDIC в ASCII или обращение к порядку байтов ... в настоящее время это не является обычной потребностью).Раньше я думал, что
dd
это быстрее для копирования больших блоков данных на один диск (из-за более эффективного использования буферизации), но это не так , по крайней мере, в современных системах Linux.Я думаю, что некоторые из
dd
параметров полезны при работе с лентами, где чтение действительно выполняется в блоках (драйверы ленты не скрывают блоки на носителе, как это делают драйверы дисков). Но я не знаю специфики.Единственное, что
dd
может сделать то, что не может (легко) сделать любой другой инструмент POSIX, - это взять первые N байтов потока. Многие системы могут сделать этоhead -c 42
, ноhead -c
, хотя и распространены, не в POSIX (и не доступны сегодня, например, на OpenBSD). (tail -c
это POSIX.) Кроме того, даже там, где онhead -c
существует, он может считывать слишком много байтов из источника (поскольку он использует внутреннюю буферизацию stdio), что является проблемой, если вы читаете из специального файла, в котором только чтение имеет эффект. (Текущие значения GNU coreutils считывают точное количествоhead -c
, но FreeBSD и NetBSD используют stdio.)В более общем смысле,
dd
предоставляет интерфейс для базового файлового API, который является уникальным среди инструментов Unix: толькоdd
может перезаписать или усечь файл в любой точке или выполнить поиск в файле. (Этоdd
уникальная способность, и она очень большая; как ни странно,dd
лучше всего известны вещи, которые могут делать другие инструменты.)>
перенаправление в оболочке.>>
перенаправления в оболочке или с помощьюtee -a
.Если вы хотите сократить файл, удалив все данные после определенной точки , это поддерживается базовым ядром и C API через
truncate
функцию, но не предоставляется никаким инструментом командной строки, кромеdd
:Если вы хотите перезаписать данные в середине файла, опять же, это возможно в API-интерфейсе underyling, открыв файл для записи без усечения (и вызывая
lseek
для перемещения в нужную позицию при необходимости), но толькоdd
может открыть файл без усечение или добавление, или поиск из оболочки ( более сложный пример ).Итак ... Как системный инструмент,
dd
в значительной степени бесполезен. Как инструмент обработки текста (или двоичного файла), он весьма ценен!источник
trunc
иseek
пригодность для использования изdd
).dd
может считывать двоичные данные из дескрипторов файлов без возможности поиска без потенциального уничтожения непрочитанных данных из-за буферизации stdio. Смотрите здесь для примера: etalabs.net/sh_tricks.htmlhead -c N
звонитread
и никогда не выходит за пределы N. В NetBSD 5.1head -c
звонкиgetc
. В FreeBSD 7.4head -c
звонкиfread
.dd
также предоставляет O_DIRECT (и т. Д.) Для сценариев оболочки, которые, я думаю, также уникальны.truncate
позволяет обрезать или расширять файлы, что исключает другое использованиеdd
.Команда
dd
включает в себя множество опций, которые кошка не в состоянии вместить. Возможно, в ваших случаях использования cat является подходящей заменой, но это не замена dd.Одним из примеров будет использование
dd
для копирования части чего-либо, но не всего. Возможно, вы хотите извлечь некоторые биты из середины ISO-образа или таблицы разделов с жесткого диска, основываясь на известном местоположении на устройстве. Сdd
его помощью можно указать параметры запуска, остановки и количества, которые разрешают эти действия.Эти опции
dd
делают его незаменимым для мелкозернистой обработки данных, тогда какcat
* может работать только с целыми файловыми объектами, устройствами или потоками.* Как отметил Жиль в комментариях, его можно комбинировать
cat
с другими инструментами, чтобы изолировать части чего-либо, но приcat
этом он действует на весь объект.источник
dd
на самом деле не имеет ничего общего с низкоуровневыми устройствами, он нуждается в записи,/dev
как и другие. Вы можете скопировать весь раздел с помощьюcat
или его часть с помощьюtail +c $(($start+1)) | head -c $count
.cat | head | tail
чтобы извлечь последние несколько МБ, вращение диска высосет луну ближе к земле.Никто еще не упомянул, что вы можете использовать dd для создания разреженных файлов , хотя
truncate
также могут использоваться для той же цели.Это почти мгновенно и создает произвольный большой файл, который можно использовать, например, в качестве петлевого файла:
Приятно то, что изначально он использует только один блок дискового пространства, а затем увеличивается только по мере необходимости (форматирование ext4 файла 10 ГБ в моей системе занимает 291 МБ). Используйте,
du
чтобы увидеть, сколько фактически места на диске используется -ls
сообщает только о максимальном размере файла.источник
ls -ls
показывает вам редкий размер.dd of=sparse-file bs=1 count=0 seek=10G
будет эквивалентноtruncate -s 10GB sparse-file
. Достаточно запутанно,truncate
иdd
имеют совершенно противоположную интерпретациюGB
противG
...man dd
говорит:MB =1000*1000, M =1024*1024
и так далее. Иman truncate
говорит:MB 1000*1000, M 1024*1024
так что разницы нет. Я используюdd
иtruncate
из GNU coreutils. Вы тоже должны это сделать! :-)Переопределение определенных сегментов жесткого диска чем-то - типичный пример. Например, вы можете удалить MBR с помощью этой команды:
Также вы можете создавать пустые файлы с ним (скажем, для циклических образов дисков):
источник
head -c
? Пожалуйста, поделитесь ориентиром !dd
очень полезно для резервного копирования загрузочного сектора жесткого диска или другого устройства хранения (dd if=/dev/sda of=boot_sector.bin bs=512 count=1
), а затем перезаписывает его (dd if=boot_sector.bin of=/dev/sda
). Это также полезно для резервного копирования заголовков зашифрованных томов.cat
возможно, я смогу это сделать, но я бы не стал доверять этому в части переписывания. Трудно получитьcat
только чтение / запись определенного количества байтов.источник
У меня недавно была причина клонировать несколько разделов размером в несколько сотен гигабайт впервые в моей истории linuxing (ср.
cp -ar
Илиrsync
которые хорошо мне служили много раз). Конечно, я обратился кdd
, потому что все знают, что это то, что вы используете ... и был потрясен производительностью. Вскоре меня немного погуглилоddrescue
, что я уже использовал несколько раз и работает великолепно (намного быстрее, чем dd).источник
ddrescue
отлично, особенно для получения данных с неисправных дисков.Вот несколько трюков, которые я придумал за эти годы.
Вырежьте и вставьте в недружелюбный tty или неинтерактивный режим bash
Если вы находитесь в ситуации, когда EOF / ^ D / ^ F не обнаружен, вы можете использовать dd для передачи текстовых файлов на хост. Так как он остановит чтение после указанного количества байтов автоматически.
Я использовал это совсем недавно, в прошлом году, во время учений по безопасности, когда мы смогли получить нетитовые оболочки на удаленном хосте и нуждались в передаче файлов.
На самом деле, я даже создал пару двоичных файлов, кодируя их с помощью base64 и используя медленный, но надежный сценарий декодирования с использованием чистого bash base64.
Очень крутой трюк в том, что во время работы dd, если вы отправите ему сигнал USR1, он выдаст свое текущее состояние (считанные байты, байты в секунду ...)
Универсальный фильтр состояния пропускной способности
Я написал это, чтобы действовать как чистый фильтр прогресса bash для любой программы, которая генерирует данные через стандартный вывод. (Примечание: практически все что угодно будет генерировать данные через stdout - для программ, которые этого не делают, вы можете обмануть, если они не будут раздражать вас, используя / dev / stdout в качестве имени файла. Но идея в основном заключается в том, что каждый раз, когда вы получаете X количество байтов, печатные хеш-метки (как в старой школе FTP, когда у вас включен хеш-режим)
(Примечание) Файл с прогрессом хромает, в основном это было доказательством концепции. Если бы я переделал это, я бы просто использовал переменную.
файлы фрагментов с использованием анонимных дескрипторов оболочки
Вот чрезвычайно псевдокодовый пример того, как вы можете иметь подписанный tar-файл, который вы можете извлечь без ошибок, предоставляя ввод tar через анонимный дескриптор файла - без использования каких-либо файлов tmp для хранения частичных данных файла.
Я считаю, что дд невероятно полезен. И это только три примера, которые я могу придумать не покладая рук.
источник
Вы можете перенаправить некоторый выходной контент. Это особенно полезно, если вам нужно написать с помощью
sudo
:Кроме того,
sudo
это эквивалентно:или к этому:
источник