在 Bash 中将 n 个字节从一个文件写入另一个文件

在 Bash 中将 n 个字节从一个文件写入另一个文件

您好,如何使用 Bashn将一个文件中的字节从该位置开始写入新文件中?k

  • 例如,如果 n=60、k=1 且文件大小=100,则:第二个文件将由第 1 个字节到第 60 个字节组成,大小为 60 个字节
  • 例如,如果 n=40、k=61 且文件大小=100,则:第二个文件将由第 61 个字节到第 100 个字节组成,大小为 40 个字节

我们可能处理的是二进制文件而不是 ASCII 文件,因此两半的连接应该与原始文件相同!

(可以吗dd?)

答案1

是的。根据dd 手册页,您正在寻找类似以下内容的内容:

dd bs=1 count=60 if=_filename_1_ of=_filename_2_
dd bs=1 skip=60 count=40 if=_filename_1_ of=_filename_2_

其中_filename_n_替换为实际的文件名。

bs=1表示countskip是字节数。 skip是跳过的字节数;count是复制的字节数。 编辑字节计数从 0 开始,而不是从 1 开始。因此,要从第一个字节开始,请使用skip=0(或保留skip未指定)。

作为 bash 函数,你可以使用:

# copy_nk(n, k, infile, outfile)
copy_nk() {
    dd bs=1 count="$1" skip="$2" ${3:+if="$3"} ${4:+of="$4"}
}

然后将其称为

copy_nk 60 0 infile.txt outfile.txt

(k=0因为字节数从零开始)。

使用${3:+...},您可以省略输出文件或输入文件。例如,

cat infile.txt | copy_nk 60 0 > outfile.txt

答案2

以下是使用headbash 命令组的另一种方法:

{ head -c60 > /dev/null ; head -c40 > output.txt ; } < input.txt

这里第一个head从input.txt读取前60个字节并将其发送到位桶。

因为这些head命令在命令组内,所以文件在 input.txt 中的位置将被保留。因此,第二个命令head将读取接下来的 40 个字节(从字节 61 到 100,使用从 1 开始的索引),并将其写入 output.txt。


实际上,这种方法可以推广到提供split类似的功能,但还有一个额外的好处,即能够指定每个输出文件的长度。假设我们有一个 100 字节的文件,我们想将其拆分成大小为 7、50、23 和余数的块。我们可以这样做:

{
    head -c7 > 7bytes.txt
    head -c50 > 50bytes.txt
    head -c23 > 23bytes.txt
    cat > remaining-bytes.txt
} < input.txt

相关内容