Re: Perl: "find -newer" in nativ

2023-02-24 Diskussionsfäden Hilmar Preuße

On 2/13/23 01:11, Andreas Fett wrote:

On Sun, Feb 12, 2023 at 03:48:36PM +0100, Hilmar Preuße wrote:


Hallo,


my $wanted = sub {
     my $stat = stat($_);
     return unless -f $stat;
     return unless $stat->mtime > $touchstat->mtime;
     return unless /$filePattern/;
     push @files, $File::Find::name;
};

find($wanted, glob("/var/log/icinga/logs"));


Eine Anmerkung noch. Es ist eventuell effizienter, wenn Du den Check
auf den Filename vor das stat() legst. Ich bin mir nicht 100% sicher,
ob das im konkreten Anwendungsfall wirklich nen Unterschied macht, aber
solche syscalls grad bei Filesystemzeugs sind in Perl tendenziell teuer.
(in C würd ich das definitiv davor legen)


OK, danke für Deinen Input; habe es jetzt so geändert. An der Laufzeit
des Skriptes ändert sich dadurch aber wenig, denn die echten Zeitfresser
sind weiter hinten.

Hilmar
--
Testmail



Re: Perl: "find -newer" in nativ

2023-02-13 Diskussionsfäden Heiko Schlittermann
Hilmar Preuße  (Sa 11 Feb 2023 12:50:20 CET):
> Moin,
> zu doof, google zu bedienen (nein bei ChatGPT war ich noch nicht). Ich
> suche in einer Directory Structur eine Liste von Files, die aktueller
> sind als ein Referenz-File. Aktuell mache ich das so:
> 
> my @files1 = `find /path/to/pen8*/pools/*/logf -type f -newer $touchfile
> -name "Psipenta_*.log" 2> /dev/null`;

Das wäre meine Variante:

```
#!/usr/bin/perl
use strict;
use warnings;
use File::Find;
use File::FnMatch 'fnmatch';

my $touchfile = shift // die "need name of touchfile\n";
my @dirs = @ARGV or die "need directories\n";

sub newer {
my $files = shift;
my $ref = -M shift;
my $pattern = shift;
return sub {
return unless fnmatch $pattern, $_; # name is cheap
return unless -f;   # implies a stat, may be 
expensive
return if -M _ > $ref;  # "_" uses stat cache
push @$files, $File::Find::name;
}
}

my @files;
find(newer(\@files, $touchfile, "*.log"), @dirs);
print join "\n", @files;
```

-- 
Heiko


signature.asc
Description: PGP signature


Re: Perl: "find -newer" in nativ

2023-02-12 Diskussionsfäden Andreas Fett
Hallo,

On Sun, Feb 12, 2023 at 03:48:36PM +0100, Hilmar Preuße wrote:
> my $wanted = sub {
>     my $stat = stat($_);
>     return unless -f $stat;
>     return unless $stat->mtime > $touchstat->mtime;
>     return unless /$filePattern/;
>     push @files, $File::Find::name;
> };
> 
> find($wanted, glob("/var/log/icinga/logs"));

Eine Anmerkung noch. Es ist eventuell effizienter, wenn Du den Check
auf den Filename vor das stat() legst. Ich bin mir nicht 100% sicher,
ob das im konkreten Anwendungsfall wirklich nen Unterschied macht, aber
solche syscalls grad bei Filesystemzeugs sind in Perl tendenziell teuer.
(in C würd ich das definitiv davor legen)

Grüsse
Andreas


signature.asc
Description: PGP signature


Re: Perl: "find -newer" in nativ

2023-02-12 Diskussionsfäden Hilmar Preuße

Am 12.02.2023 um 16:13 teilte Andreas Fett mit:

On Sun, Feb 12, 2023 at 03:48:36PM +0100, Hilmar Preuße wrote:


Moin,


find($wanted, glob("/var/log/icinga/logs"));

>

Dass glob() ist die Filenameexpansion wie in der Shell. Ich
hatte das drin, weil Dein ursprüngliches Beispiel dort
"/path/to/pen8*/pools/*/logf" verwendet hatte. Wenn der Pfad ohne
wildcards ist wie oben brauchst Du das glob() nicht.



Ja, danke. Das brauche ich auch. Die Pfadangabe ohne Wildcards sind
erstmal vom Test-System, da sind die File-System Strukturen etwas anders.

Hilmar
--
sigfault



Re: Perl: "find -newer" in nativ

2023-02-12 Diskussionsfäden Andreas Fett
Hallo,

On Sun, Feb 12, 2023 at 03:48:36PM +0100, Hilmar Preuße wrote:
> Am 11.02.2023 um 16:36 teilte Andreas Fett mit:
> 
> Moin,
> 
> > Den Match für den Filenamen bekommste selber hin :-)
> > 
> Habe mich schwer getan, aber ich denke ich habs. Bin halt kein
> Programmierer. Hier nur der Teil, den ich geändert habe.
> ...


> find($wanted, glob("/var/log/icinga/logs"));
Dass glob() ist die Filenameexpansion wie in der Shell. Ich
hatte das drin, weil Dein ursprüngliches Beispiel dort
"/path/to/pen8*/pools/*/logf" verwendet hatte. Wenn der Pfad ohne
wildcards ist wie oben brauchst Du das glob() nicht.

Grüsse
Andreas


signature.asc
Description: PGP signature


Re: Perl: "find -newer" in nativ

2023-02-12 Diskussionsfäden Hilmar Preuße

Am 11.02.2023 um 16:36 teilte Andreas Fett mit:

Moin,


Den Match für den Filenamen bekommste selber hin :-)


Habe mich schwer getan, aber ich denke ich habs. Bin halt kein
Programmierer. Hier nur der Teil, den ich geändert habe.

my $touchfile = '/var/log/icinga/Log_stamp';
my $touchstat = stat($touchfile) or die "No $touchfile: $!";
my $filePattern = 'Name_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]_.*\.log$' ;
my @files = ();

my $wanted = sub {
    my $stat = stat($_);
    return unless -f $stat;
    return unless $stat->mtime > $touchstat->mtime;
    return unless /$filePattern/;
    push @files, $File::Find::name;
};

find($wanted, glob("/var/log/icinga/logs"));

Danke,
  Hilmar
--
sigfault



Re: Perl: "find -newer" in nativ

2023-02-11 Diskussionsfäden Andreas Fett
Hallo,

On Sat, Feb 11, 2023 at 12:50:20PM +0100, Hilmar Preuße wrote:
> Moin,
> 
> voran: ich bin ein absoluter Perl Noob und bin darum wahrscheinlich auch
> zu doof, google zu bedienen (nein bei ChatGPT war ich noch nicht). Ich
> suche in einer Directory Structur eine Liste von Files, die aktueller
> sind als ein Referenz-File. Aktuell mache ich das so:
> 
> my @files1 = `find /path/to/pen8*/pools/*/logf -type f -newer $touchfile
> -name "Psipenta_*.log" 2> /dev/null`;
> 
> In $touchfile findet sich der Name meines Referenz-Files. Ich bin mir
> sicher, das kann man auch nativ in Perl machen. Bitte um Hilfe.

 snip 
#!/bin/perl
#
use warnings;
use strict;

use File::stat;
use File::Find;
use Data::Dumper;

my $touchfile = 'ref.txt';

my $touchstat = stat($touchfile) or die "No $touchfile: $!";

my @files = ();
my $wanted = sub {
my $stat = stat($_);
push @files, $File::Find::name if -f $stat && $stat->mtime > 
$touchstat->mtime; # TODO check name
};

find($wanted, glob("/path/to/pen8*/pools/*/logf"));

print Dumper(@files);
 snip 

Den Match für den Filenamen bekommste selber hin :-)

https://perldoc.perl.org/File::Find
https://perldoc.perl.org/perlrequick

viel Spass.

Grüsse
Andreas





signature.asc
Description: PGP signature