Мне нужно объединить куски из двух файлов:
если бы мне нужно было объединить целые файлы, я мог бы просто сделать
cat file1 file2 > output
Но мне нужно пропустить первые 1 МБ из первого файла, и мне нужно только 10 МБ из второго файла. Похоже, работа для dd
.
dd if=file1 bs=1M count=99 skip=1 of=temp1
dd if=file2 bs=1M count=10 of=temp2
cat temp1 temp2 > final_output
Есть ли возможность сделать это за один шаг? т.е. без необходимости сохранять промежуточные результаты? Могу ли я использовать несколько входных файлов в dd
?
oflag=append conv=notrunc
), поэтому файловые системы, которые выполняют отложенное размещение (например, XFS), с наименьшей вероятностью решат, что файл готов к записи, когда еще многое предстоит сделать.dd
ее не просятsync
, отсроченное распределение в любом случае не должно начинаться немедленно (если только память не ограничена, в этом случае ни один из методов не откладывает выделение).bash
иmksh
что не оптимизируют из вил для последней команды в субоболочке, вы можете сделать его немного более эффективным путем замены подоболочки с командной группой. Для других оболочек это не должно иметь значения, и подход подоболочек может быть даже несколько более эффективным, поскольку оболочке не требуется сохранять и восстанавливать стандартный вывод.Я не думаю, что вы можете легко прочитать несколько файлов за один
dd
вызов, но вы можете добавить, чтобы создать выходной файл в несколько шагов:Вам нужно указать оба
conv=notrunc
иoflag=append
. Первый избегает усечения вывода, второй начинает запись с конца существующего файла.источник
Имейте в виду , что
dd
является низкоуровневым интерфейсом кread()
,write()
иlseek()
системный вызов. Вы можете надежно использовать его только для извлечения фрагментов данных из обычных файлов, блочных устройств и некоторых символьных устройств (например/dev/urandom
), то есть файлов, для которыхread(buf, size)
гарантированно будет возвращаться,size
пока не достигнут конец файла.Для каналов, сокетов и большинства символьных устройств (таких как ttys) у вас нет такой гарантии, если вы не
read()
используете размер 1 или не используетеdd
расширение GNUiflag=fullblock
.Так что либо:
Или:
Или с оболочками со встроенной поддержкой оператора поиска, например
ksh93
:Или
zsh
(если выhead
поддерживаете-c
опцию здесь):источник
$IFS
. Это независимо от содержимого переменной / расширения. См. Также последствия для безопасности, связанные с забыванием заключать в кавычки переменную в оболочках bash / POSIXgdd
вместоdd
. Это опечатка, или это намеренно?С bash ism и функционально «бесполезным использованием cat », но наиболее близким к синтаксису, который использует OP:
(При этом ответ Стивена Китта представляется наиболее эффективным из возможных).
источник
<(...)
это кшизм, который и такzsh
иbash
скопировал.