【问题标题】:bash compare the contents of two files and based on the results do two different actionsbash 比较两个文件的内容并根据结果执行两个不同的操作
【发布时间】:2016-11-14 01:29:38
【问题描述】:

不能使用diff,也不能使用cmp

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

#!/bin/bash
# http://stackoverflow.com/a/14500821/175063

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

它总是返回:

文件没有变化

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

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

【问题讨论】:

  • comm 始终返回 0,即使在失败时(例如找不到文件)。您需要检查 stdout 以查看 comm 是否有输出。
  • 文件是什么样的?你知道$?是最后一个进程的退出状态而不是行数吗?
  • $? 同上。此外,comm -23 在 old.txt 中返回不在 new.txt 中的行。 new.txt 中不在 old.txt 中的行将被忽略。这就是你想要的吗?
  • 是的 comm -23 将显示文件名的差异。我很确定退出代码不是本示例所需要的。我要查找文件夹中的文件内容是否有差异来提醒我,否则等到下次脚本运行时。
  • 你能用awk吗?

标签: bash diff cmp comm


【解决方案1】:

你应该可以使用:

! 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

【讨论】:

  • 这是我一直在寻找的解决方案!谢谢!!
【解决方案2】:

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,因此它将打印新文件,因为这正是您的消息所暗示的。

【讨论】:

  • 不算。这些文件是从供应商处更新的。就像文件 101.dat 将更新为 102.dat 并且文件 101.dat 将被删除。我们想知道本例中的文件 102.dat 是否会收到通知。
  • 这会计算new.txt 中但不在old.txt 中的行数。所以计数将是1,因为102.dat 在新文件中,但不在旧文件中。
  • 删除的行不计入,按comm -23计入。
猜你喜欢
  • 2013-08-27
  • 2019-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-25
相关资源
最近更新 更多