比较 2 个文件并在存在差异时运行脚本

比较 2 个文件并在存在差异时运行脚本

我有一个用于文本转换的shell脚本,但是使用起来很麻烦并且依赖于手动判断和执行。其工作原理如下。

步骤1:下载原始数据文本。

wget http://example.com/raw.txt

步骤 2:手动比较上次下载文件的内容是否存在差异。

文本的内容格式比较简单,一行一串。如果内容增加了,则需要运行脚本处理。

# Last downloaded file content:
wtKpjv
uJlQm1
iS86aE
Hk6ycS
hAYj7k

# Now downloaded file content:
wtKpjv
uJlQm1
RiU8iM
iS86aE
Hk6ycS
qyDNaZ
hAYj7k

# Compare the increased content:
RiU8iM
qyDNaZ

步骤3:如果比较结果有差异,则需要运行脚本处理。

./text_processing.sh raw.txt > new.text

以上是我目前的使用步骤。如何设置自动化任务来完成此过程?

我想每天检查一次。如果文本内容更新,我需要立即运行脚本。如果没有更改,该脚本每 3 天运行一次。

如果有人能帮助我,我将非常感激。

答案1

您的问题对您的要求有点模糊。

如果您只想检查任何差异,请使用cmp -s oldfile newfile.如果文件相同,将以 true 状态退出:

if cmp -s oldfile newfile
then echo files are the same
else echo files are different
     ./text_processing.sh ...
fi

如果您想检查文件大小是否增加,则可以使用wc -c(用于字符计数)、wc -l(用于行计数),或者stat --format=%s直接使用有关文件的元数据来给出总大小(以字节为单位)。

if [ $(wc -c oldfile) -lt $(wc -c newfile) ]
then echo oldfile is smaller
     ./text_processing.sh ...
fi

$( ... )运行随附的命令并将其输出替换到命令行中。[ ... -lt ... ]测试第一个参数是否是埃斯第二个论点。

如果您特别想检查是否添加了一行,那么最好的策略可能是首先对两个文件进行排序,然后使用comm过滤掉公共行:

sort -o oldfile.sorted oldfile
sort -o newfile.sorted newfile
if [ $(comm -13 oldfile.sorted newfile.sorted | wc -l) -gt 0 ]
then echo 'line(s) only found in newfile'
     ./text_processing.sh ...
fi

comm -13匹配两个文件中的行。通常,每行都会输出,并带有缩进来指示该行是仅出现在第一个文件中,还是仅出现在第二个文件中,或同时出现在两个文件中。由于-13仅来自第一个文件的行和公共行被抑制,因此仅输出第二个文件中出现的那些行。它通过管道输送到wc -l对行进行计数,并且经测试大于 0。

请注意,更改的行将仅在第一个文件中由一行表示,而仅在第二个文件中由另一行表示。

相关内容