使用 Perl 检查文件内容是否已更改

时间:2021-06-21 02:18:14

标签: perl

我想创建一个脚本来检测对文件所做的任何更改。这是我的起始代码。检测到更改后,我将使用 %%R -i df library(ggplot2) ggplot(df, aes(x=reorder(cups_of_coffee,productivity), y=productivity)) + geom_col() + coord_flip() 将新数据上传到在线数据库中。

下面这个例子只是一个在线解决方案,也欢迎其他类型的查找。

我需要的伪代码:

curl

实际代码检查文件内容是否已更改:

if (file content changed)
{
   #upload data 
   printf "file content changed, newest data uploaded";
}else{
   printf "file content no change"; 
   #do nothing
}

这段代码的问题是,每次我运行这个脚本时,它总是以更改开始,即使文件在保存时没有被修改。我应该改变什么?我应该排除时间吗?

1 个答案:

答案 0 :(得分:1)

您可以使用 Storable 模块来保留您的“旧”值。

示例:

#! /usr/bin/perl
use strict;
use warnings;
use Storable;
use Digest::SHA qw(sha256_hex);

use Data::Dumper;
$Data::Dumper::Terse = 1;

my $old;
if (-e 'old') {
  $old = retrieve ('old');
} else {
  $old = {mtime => 0, size => 0, digest => ''};
}
END {
  store $old, 'old';
}

print "$$: old: ", Dumper ($old);

my $filename = 'data.list';

my ($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size,
    $atime, $mtime, $ctime, $blksize, $blocks) = stat($filename);

if ($mtime != $old->{mtime} || $size != $old->{size}) {
  # slurp in entire file and get its sha256 hash
  local $/;
  open(my $fh, "<", $filename) or die "couldn't open $filename: $!\n";
  my $digest = sha256_hex(<$fh>);
  close($fh);

  if ($digest ne $old->{digest}) {
    printf "$$: changes were made\n";
    $old->{digest} = $digest; 
    $old->{mtime}  = $mtime;
    $old->{size}   = $size;
    print "$$: new: ", Dumper ($old);
  } else {
    print "$$: no changes were made\n";
  }
} else {
  print "$$: no changes were made\n";
}

初始化 data.list

$ echo 1 > data.list

旧值在第一次运行时被初始化:

$ ./storable.pl
2605: old: {
  'size' => 0,
  'mtime' => 0,
  'digest' => ''
}
2605: changes were made
2605: new: {
  'size' => 2,
  'mtime' => 1624266579,
  'digest' => '4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865'
}

如果再次运行,旧值将从文件“old”中读取:

$ ./storable.pl
2610: old: {
  'size' => 2,
  'mtime' => 1624266579,
  'digest' => '4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865'
}
2610: no changes were made

但是当您更改文件时,会检测到更改:

$ echo 2 > data.list 
$ ./storable.pl
2615: old: {
  'digest' => '4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865',
  'mtime' => 1624266579,
  'size' => 2
}
2615: changes were made
2615: new: {
  'digest' => '53c234e5e8472b6ac51c1ae1cab3fe06fad053beb8ebfd8977b010655bfdd3c3',
  'mtime' => 1624266608,
  'size' => 2
}

我会使用 cron-job 代替 sleep

相关问题