我想创建一个脚本来检测对文件所做的任何更改。这是我的起始代码。检测到更改后,我将使用 %%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
}
这段代码的问题是,每次我运行这个脚本时,它总是以更改开始,即使文件在保存时没有被修改。我应该改变什么?我应该排除时间吗?
答案 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
。