Answers:
dd
也可以写到stdout。
( dd if=file1 bs=1M count=99 skip=1
dd if=file2 bs=1M count=10 ) > final_output
dd
不被要求sync
,延迟分配无论如何都不应立即生效(除非内存太紧,在这种情况下,任何一种方法都不会推迟分配)。
bash
并且mksh
不能优化子shell中最后一个命令的fork,可以通过用命令组替换subshell使其效率更高。对于其他Shell,这无关紧要,由于外壳不需要保存和还原stdout,因此subshell方法甚至可能稍微更高效。
请记住,dd
是一个原始界面的read()
,write()
和lseek()
系统调用。您只能可靠地使用它从常规文件,块设备和某些字符设备(例如/dev/urandom
)中提取数据块,即只要不到达文件末尾,就read(buf, size)
可以保证为其返回size
文件。
对于管道,套接字和大多数字符设备(例如ttys),除非read()
具有1的大小或使用GNU dd
扩展名,否则没有任何保证iflag=fullblock
。
所以:
{
gdd < file1 bs=1M iflag=fullblock count=99 skip=1
gdd < file2 bs=1M iflag=fullblock count=10
} > final_output
要么:
M=1048576
{
dd < file1 bs=1 count="$((99*M))" skip="$M"
dd < file2 bs=1 count="$((10*M))"
} > final_output
或具有内置支持的壳,例如ksh93
:
M=1048576
{
command /opt/ast/bin/head -c "$((99*M))" < file1 <#((M))
command /opt/ast/bin/head -c "$((10*M))" < file2
}
或者zsh
(假设您head
支持-c
此处的选项):
zmodload zsh/system &&
{
sysseek 1048576 && head -c 99M &&
head -c 10M < file2
} < file1 > final_output
$IFS
。这与变量/扩展的内容无关。另见遗忘在bash / POSIX壳引用变量的安全隐患
gdd
而不是dd
。这是错字,还是故意的?
具有bash ism和功能上“无用的cat ”,但最接近OP使用的语法:
cat <(dd if=file1 bs=1M count=99 skip=1) \
<(dd if=file2 bs=1M count=10) \
> final_output
(话虽如此,斯蒂芬·基特的回答似乎是最有效的方法。)
<(...)
是一个既被复制又被复制的kshism。zsh
bash
oflag=append conv=notrunc
),因此延迟分配的文件系统(例如XFS)最不可能在尚需处理的时候确定文件已被写入。