我会喜欢一些Bash脚本循环的帮助,它将显示两个二进制文件之间的所有区别,使用
cmp file1 file2
它只显示我想使用cmp的第一个改变,因为它给出了一个行号,每一个改变的位置,但如果你认为有一个更好的命令,我打开它:)谢谢
为什么有一个“预期的整数expression式”?
在bash中使用variablescp
用shell脚本(bash)find我系统的ip地址,
使用sed和pstree来显示正在使用的terminal的types
我认为cmp -l file1 file2可能会做你想做的。 从手册:
-l --verbose Output byte numbers and values of all differing bytes.
输出是偏移量的表,file1中的字节值和file2中所有不同字节的值。 它看起来像这样:
4531 66 63 4532 63 65 4533 64 67 4580 72 40 4581 40 55 [...]
所以第一个区别在偏移量4531,其中file1的十进制字节值是66,file2是63。
我找到的更有效的解决方法是使用od将二进制文件转换为某种形式的文本。
然后任何diff味道很好。
diff <(od -An -tx1 -w1 -v file1) <(od -An -tx1 -w1 -v file2)
for i in `seq 128`; do printf "%02x" "$i"; done | xxd -r -p > file1 for i in `seq 128`; do if [ "$i" -ne 64 ]; then printf "%02x" $i; fi; done | xxd -r -p > file2
输出:
64d63 < 40
如果你还想看到字符的ASCII版本:
bdiff() ( f() ( od -An -tx1c -w1 -v "$1" | paste -d '' - - ) diff <(f "$1") <(f "$2") ) bdiff file1 file2
输出:
64d63 < 40 @
在Ubuntu 16.04上测试
我更喜欢od xxd因为:
是POSIX , xxd不是(自带Vim)
有-An没有awk删除地址列。
命令解释:
-An删除地址栏。 这一点很重要,否则所有的行在添加/删除字节后都会有所不同。
-w1每行放一个字节,以便diff可以消耗它。 每行一个字节是至关重要的,否则删除后的每一行都会变得不同相并且不同。 不幸的是,这不是POSIX,而是存在于GNU中。
-tx1是你想要的表示,只要你保持每行1个字节,就改变为任何可能的值。
-v防止可能干扰diff的星号重复缩写*
paste -d '' - -每两行加入。 我们需要它,因为十六进制和ASCII进入单独的相邻行。 采取: 连接其他每一行与下一个
我们使用括号()来定义bdiff而不是{}来限制内部函数f的范围,另请参阅: 如何在bash中的另一个函数内定义一个函数
也可以看看:
https://superuser.com/questions/125376/how-do-i-compare-binary-files-in-linux
https://unix.stackexchange.com/questions/59849/diff-binary-files-of-different-sizes
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。