文本文件中的以下代码行将大致完成您所要求的(我认为):将文件从一个位置复制到另一个位置,但将一个位置的字节块替换为另一个位置的块;它dd
按要求使用。但是,它确实创建了一个单独的输出文件——这对于确保没有冲突是必要的,无论“输入”块是否出现在“替换”块之前或之后。请注意,如果 A 和 B 之间的距离小于要替换的块的大小,它将不会执行任何操作 - 这将导致重叠,并且不清楚您是否希望重叠区域中的字节为“结束A”或“A 副本的开始”。
将其保存在一个名为 的文件中blockcpy.sh
,并将权限更改为包含execute
(例如chmod 755 blockcpy.sh
)。运行它
./blockcpy.sh inputFile outputFile from to length
请注意,“from”和“to”偏移量的基数为零:因此,如果要复制从文件开头开始的字节,则from
参数为 0
这是文件内容:
#!/bin/bash
# blockcpy file1 file2 from to length
# copy contents of file1 to file2
# replacing a block of bytes at "to" with block at "from"
# length of replaced block is "length"
blockdif=$(($3 - $4))
absdif=${blockdif#-}
#echo 'block dif: ' $blockdif '; abs dif: ' $absdif
if [ $absdif -ge $5 ]
then
# copy bytes up to "to":
dd if=$1 of=$2 bs=$4 count=1 status=noxfer 2>0
# copy "length" bytes from "from":
dd bs=1 if=$1 skip=$3 count=$5 status=noxfer 2>0 >> $2
# copy the rest of the file:
rest=$((`cat $1 | wc -c` - $4 - $5))
skip=$(($4 + $5))
dd bs=1 if=$1 skip=$skip count=$rest status=noxfer 2>0 >> $2
echo 'file "'$2'" created successfully!'
else
echo 'blocks A and B overlap!'
fi
“ 2>0
'nix 魔法”抑制来自 stderr 的输出,否则会显示在输出中(类型:“ 16+0 records in
”)。