STATUS="$(cmp --silent $FILE1 $FILE2; echo $?)" # "$?" gives exit status for each comparison
if [[ $STATUS -ne 0 ]]; then # if status isn't equal to 0, then execute code
DO A COMMAND ON $FILE1
else
DO SOMETHING ELSE
fi
identical (){
echo "$1" and "$2" are the same.
echo This is a function, you can put whatever you want in here.
}
different () {
echo "$1" and "$2" are different.
echo This is a function, you can put whatever you want in here, too.
}
cmp -s "$FILEA" "$FILEB" && identical "$FILEA" "$FILEB" || different "$FILEA" "$FILEB"
9条答案
按热度按时间js81xvg61#
我相信
cmp
会在第一个字节差处停止:ecfsfe2w2#
我喜欢@Alex Howansky用“cmp --silent”来表达这个意思。但是我需要正面和负面的回应,所以我用途:
然后,我可以在终端中运行该命令,或者使用ssh根据常量文件检查文件。
kuuvgm7e3#
要快速和安全地比较任意两个文件:
它可读性强,效率高,适用于任何文件名,包括
"
$()`gupuwyp24#
因为我吸,没有足够的声誉点,我不能把这个花絮作为一个评论。
但是,如果您要使用
cmp
命令(并且不需要/不想冗长),则可以只获取退出状态。如果FILE为'-'或丢失,则读取标准输入。如果输入相同,则退出状态为0;如果不同,则退出状态为1;如果有问题,则退出状态为2。
因此,您可以执行以下操作:
编辑:谢谢大家的评论!我在这里更新了测试语法。但是,如果你想在可读性、风格和语法上寻找类似的答案,我建议你使用Vasili的答案。
pu82cl6c5#
对于没有不同的文件,任何方法都需要完全读取这两个文件,即使读取是在过去。
没有其他选择。因此在某个时间点创建哈希或校验和需要阅读整个文件。大文件需要时间。
文件元数据检索比阅读大文件快得多。
那么,是否有任何文件元数据可以用来确定文件是不同的?文件大小?甚至是文件命令的结果,它只读取了文件的一小部分?
文件大小示例代码片段:
如果文件大小相同,则您将无法读取全部文件。
2eafrhcq6#
另请尝试使用cksum命令:
cksum命令将输出文件的字节计数。请参阅“man cksum”。
jm81lzqq7#
在用Raspberry Pi 3B+做一些测试时(我使用的是覆盖文件系统,需要定期同步),我自己对diff -q和cmp -s进行了比较;请注意,这是来自/dev/shm内部的日志,因此磁盘访问速度不是问题:
我运行了几次。CMP -S在我使用的测试框上的时间一直略短。所以如果你想用CMP -S在两个文件之间做事情...。
zujrkrfu8#
如果你正在寻找更多的可定制的差异,那么
git diff
可以使用。"安静"
禁用程序的所有输出。隐含--exit-code。
--退出代码
使程序退出时的代码类似于diff(1),即如果存在差异,则退出时的代码为1,0表示没有差异。
此外,还有各种算法和设置可供选择:[ref](英文)
--差分算法={耐心|极小的|直方图|迈尔斯}
选择diff算法。变量如下:
default,myers基本的贪婪diff算法。目前,这是默认值。
minimal花费额外的时间以确保产生尽可能小的差异。
patience生成补丁时使用“patience diff”算法。
直方图此算法将耐心算法扩展为“支持低出现次数的常见元素”。