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