我有一个shell脚本,我需要检查两个文件是否包含相同的数据。我对很多文件都这样做,在我的脚本中,diff命令似乎是性能瓶颈。
歌词是这样的:
diff -q $dst $new > /dev/null
if ($status) then ...
是否有一种更快的方法来比较文件,也许是一个自定义算法而不是默认的diff?
我有一个shell脚本,我需要检查两个文件是否包含相同的数据。我对很多文件都这样做,在我的脚本中,diff命令似乎是性能瓶颈。
歌词是这样的:
diff -q $dst $new > /dev/null
if ($status) then ...
是否有一种更快的方法来比较文件,也许是一个自定义算法而不是默认的diff?
当前回答
快速、安全地比较任意两个文件:
if cmp --silent -- "$FILE1" "$FILE2"; then
echo "files contents are identical"
else
echo "files differ"
fi
它是可读的,高效的,并且适用于任何文件名,包括“' $()”
其他回答
我相信cmp将在第一个字节差处停止:
cmp --silent $old $new || echo "files are different"
因为我很糟糕,没有足够的声誉点,我不能把这个花絮作为评论。
但是,如果您打算使用cmp命令(并且不需要/不想太冗长),您可以只获取退出状态。根据cmp手册页:
如果FILE为'-'或缺失,则读取标准输入。退出状态为0 如果输入相同,1如果不同,2如果麻烦。
所以,你可以这样做:
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
编辑:感谢大家的评论!我在这里更新了测试语法。但是,如果您正在寻找与这个答案在可读性、风格和语法方面类似的东西,我建议您使用Vasili的答案。
你可以通过校验和算法进行比较,比如sha256
sha256sum oldFile > oldFile.sha256
echo "$(cat oldFile.sha256) newFile" | sha256sum --check
newFile: OK
如果文件是不同的,结果将是
newFile: FAILED
sha256sum: WARNING: 1 computed checksum did NOT match
我喜欢@Alex Howansky用“cmp -silent”来表示这个。但我需要积极和消极的回应,所以我使用:
cmp --silent file1 file2 && echo '### SUCCESS: Files Are Identical! ###' || echo '### WARNING: Files Are Different! ###'
然后,我可以在终端中运行它,或者使用ssh根据常量文件检查文件。
快速、安全地比较任意两个文件:
if cmp --silent -- "$FILE1" "$FILE2"; then
echo "files contents are identical"
else
echo "files differ"
fi
它是可读的,高效的,并且适用于任何文件名,包括“' $()”