您好,如何使用 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
表示count
和skip
是字节数。 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
以下是使用head
bash 命令组的另一种方法:
{ 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