我正在尝试编写 diff 和 patch 命令的脚本。如果bzcat
使用的话,会遇到这样的警告
# bzcat consolidated.patch.tar.bz2 | patch -d dev -p1
patch unexpectedly ends in middle of line
patch unexpectedly ends in middle of line
# echo $?
0
如果用解压后的文件打补丁就不会出现这样的警告
# tar -xf consolidated.patch.tar.bz2
# patch -d dev -p1 < consolidated.patch
# echo $?
0
我确实比较了结果文件夹,但两种方法都是相同的
# diff -aurN dev1 dev2 > res.diff
# stat res.diff
File: res.diff
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
答案1
根据文件名以及它以 开头的事实tar
,您的文件consolidated.patch.tar.bz2
是一个使用 bzip2 压缩的 tar 存档。它不像 zip 存档那样,用一个工具即可将文件粘贴在一起并进行压缩,但聚合文件 ( tar
) 和压缩批次 ( bzip2
) 的两个步骤是不同的。 (除了智能实现tar
知道常见的压缩工具并可以自动执行它们。)
因此,您得到的bzcat
不是存档的文件,而是未压缩的 tar 存档。即使它只包含一个文件。难怪patch
读不了。
使用 GNU tar(至少),您可以使用-O
/--to-stdout
选项将文件数据发送到 stdout:
tar -xj -f consolidated.patch.tar.bz2 -O | patch
(或者,... -O consolidated.patch
仅输出该文件,以防它不是唯一的文件。)
如果只有一个文件,则实际上不需要该tar
步骤,并且可以在不使用 的情况下压缩文件tar
,只需使用bzip2 consolidated.patch
, 创建consolidated.patch.bz2
,然后bzcat
就可以继续工作了。