bash 比较两个文件的内容并根据结果执行两种不同的操作

bash compare the contents of two files and based on the results do two different actions

无法使用 diff 且无法使用 cmp.

我们能够成功地使用 comm,但是在脚本中使用条件时我没有得到正确的结果。

#!/bin/bash
# 

comm -23 <(sort /home/folder/old.txt) <(sort /home/folder/new.txt)
if [ $? -eq 0 ];then
   echo "There are no changes in the files"
else
   echo "New files were found. Return code was $?"
fi

总是returns:

There are no changes in the files

作为comm命令,运行成功,但文件内容不同

我对可以添加到此服务器的内容非常有限,因为它是一个公司 LINUX 框。

您应该可以使用:

! comm -3 <(sort /home/folder/old.txt) <(sort /home/folder/new.txt) | grep -q '.*'

无论是否发现差异,comm 命令都会成功(以状态 0 退出),但 grep 只有找到匹配才会成功。 -q 阻止 grep 打印匹配项,并且模式 '.*' 匹配 任何内容 。因此,如果输入非空,grep -q '.?' 就会成功。但是如果有匹配你想要成功,所以我在开头添加了 ! 来反转状态。

我还做了另一个更改:comm -23 将打印第一个文件 (old.txt) 中的行,而不是第二个文件 (new.txt) 中的行,但是它不会打印第二行而不是第一行。 comm -3 将打印其中一个文件独有的所有行,因此它会找到在两个文件之间添加的 已删除的行。

顺便说一句,不需要测试 $? 是否为零;直接使用命令作为if条件即可:

if ! comm -3 <(sort /home/folder/old.txt) <(sort /home/folder/new.txt) | grep -q '.*'; then
   echo "There are no changes in the files"
else
   echo "New files were found. Return code was $?"
fi

comm 的输出通过管道传输到 wc -l 以查看是否找到任何新文件。

new_file_count=$(comm -13 <(sort /home/folder/old.txt) <(sort /home/folder/new.txt) | wc -l)
if [ $new_file_count -eq 0];then
   echo "There are no changes in the files"
else
   echo "New files were found. Count is $new_file_count"
fi

我将 comm 命令更改为使用 -13,这样它将打印新文件,因为这正是您的消息所暗示的。