0

不能使用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 机器。

4

2 回答 2

4

您应该能够使用:

! 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
于 2016-07-12T00:59:02.583 回答
0

通过管道输出commtowc -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因此它将打印新文件,因为这就是您的消息所暗示的。

于 2016-07-12T01:00:38.400 回答