JDS*_*JDS 205 unix linux diff file
我有一个shell脚本,我需要检查两个文件是否相同.我这样做是为了很多文件,在我的脚本中,diff
命令似乎是性能瓶颈.
这是行:
diff -q $dst $new > /dev/null
if ($status) then ...
Run Code Online (Sandbox Code Playgroud)
是否有更快的方法来比较文件,可能是自定义算法而不是默认算法diff
?
Ale*_*sky 357
我相信cmp
会停在第一个字节差异:
cmp --silent $old $new || echo "files are different"
Run Code Online (Sandbox Code Playgroud)
pn1*_*ude 47
我喜欢@Alex Howansky为此使用'cmp --silent'.但我需要积极和消极的回应,所以我使用:
cmp --silent file1 file2 && echo '### SUCCESS: Files Are Identical! ###' || echo '### WARNING: Files Are Different! ###'
Run Code Online (Sandbox Code Playgroud)
然后我可以在终端中运行它或使用ssh来检查文件与常量文件.
jab*_*edo 17
为什么不获取两个文件内容的哈希值?
尝试使用此脚本,将其命名为script.sh,然后按如下方式运行:script.sh file1.txt file2.txt
#!/bin/bash
file1=`md5 $1`
file2=`md5 $2`
if [ "$file1" = "$file2" ]
then
echo "Files have the same content"
else
echo "Files have NOT the same content"
fi
Run Code Online (Sandbox Code Playgroud)
Vas*_*kov 16
快速安全地比较任意两个文件:
if cmp --silent -- "$FILE1" "$FILE2"; then
echo "files contents are identical"
else
echo "files differ"
fi
Run Code Online (Sandbox Code Playgroud)
它可读、高效,适用于任何文件名,包括 "` $()
Gre*_*tin 14
因为我很烂而且没有足够的声望点,所以我不能将这个花絮添加为评论。
但是,如果您要使用该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
Run Code Online (Sandbox Code Playgroud)
编辑:感谢大家的评论!我在这里更新了测试语法。但是,如果您正在寻找与此答案在可读性、样式和语法方面类似的内容,我建议您使用 Vasili 的答案。
小智 8
您可以通过 sha256 等校验和算法进行比较
sha256sum oldFile > oldFile.sha256
echo "$(cat oldFile.sha256) newFile" | sha256sum --check
newFile: OK
Run Code Online (Sandbox Code Playgroud)
如果文件不同,结果将是
newFile: FAILED
sha256sum: WARNING: 1 computed checksum did NOT match
Run Code Online (Sandbox Code Playgroud)