Perl nutzt die Find-Funktion, um in Schwierigkeiten zu geraten

Vorwort

Ich habe ein Skript geschrieben, das mehrere Simulationsprotokolldateien gleichzeitig überprüfen und HTML-Tabellen generieren kann. Sortieren Sie die Dateien nach Änderungszeit vom neuesten zum ältesten. Dann konnte ich die stath-Funktion nicht verwenden, um ctime zu erhalten.

Fazit: Die Suchfunktion ändert das aktuelle Verzeichnis, in dem das Programm ausgeführt wird , find(\&process_files, $dir);und die Funktion wird im Verzeichnis $dir ausgeführt .

Text

Die Verzeichnisstruktur der Testumgebung ist wie folgt:

.
├── check_logs.pl
└── logs
    ├── 1.txt
    ├── 2.txt
    └── 3.txt

1 directory, 4 files

1. Verwenden Sie die integrierte Funktion stat

Perl bietet eine integrierte Funktion stat() zum Abrufen dateibezogener Informationen, und die Funktion gibt ein Array zurück.

Offizielle Dokumentation stellt stat vor – Perldoc-Browser

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

Wir stellen einige der wichtigeren Bedeutungen vor:

  • $dev und $ino
    • Die Nummer des Geräts, auf dem sich die Datei befindet, und die Inode-Nummer der Datei.
  • $mode
    • Eine Sammlung von Berechtigungsbits für eine Datei zusammen mit anderen Informationsbits. Die unteren 9 Bits sind die Linux-Berechtigungsbits.
  • $nlink
    • Die Anzahl der Hardlinks zur Datei oder zum Verzeichnis.
  • $uid und $gid
    • Numerische Darstellung der Benutzer-ID und Gruppen-ID des Dateieigentümers
  • $Größe
    • Dateigröße in Bytes
  • $atime, $mtime und $ctime
    • Drei Zeitstempel, eine 32-Bit-Ganzzahl, die die Anzahl der Sekunden seit 1970 darstellt.
    • Zugriffszeit (atime): Die Zugriffszeit erfasst den Zeitpunkt des letzten Lesens der Datei. Immer wenn eine Datei gelesen wird, wird ihr Zugriffszeitstempel aktualisiert. Dies kann für bestimmte Anwendungen nützlich sein, beispielsweise für die Protokollüberwachung oder die Verfolgung, wie oft auf eine Datei zugegriffen wird.
    • Änderungszeit (mtime): Die Änderungszeit zeichnet den Zeitpunkt auf, zu dem der Dateiinhalt das letzte Mal geändert wurde. Wenn der Inhalt (die Daten) einer Datei geändert wird, wird der Änderungszeitstempel aktualisiert. Dies ist nützlich, um festzustellen, wann eine Datei zuletzt geändert wurde.
    • Änderungszeit (ctime): Die Änderungszeit zeichnet den Zeitpunkt auf, zu dem die Dateimetadaten das letzte Mal geändert wurden. Metadaten sind nicht datenbezogene Informationen zu einer Datei, wie etwa die Berechtigungen, der Eigentümer oder der Dateityp der Datei. Wenn sich diese Metadateneigenschaften ändern, werden ihre Änderungszeitstempel aktualisiert.

Schauen wir uns zunächst den Code an, der die integrierte Funktion verwendet, um die Änderungszeit zu ermitteln.

#! /bin/perl -w
use strict;
use warnings;
use File::Find;
use File::Basename;

my $time = (stat("./logs/1.txt"))[10];
print "$time\n";

Die Laufergebnisse sind wie folgt:

[fengbh@VM-16-14-centos perl_stat]$ ./check_logs.pl 
1703579691

2. Verwenden Sie File::stat

File::stat überschreibt die integrierte Systemfunktion, die auf Klassenart ähnliche Funktionen wie die integrierte Funktion stat bereitstellt.

Offizielle Dokumentation File::stat – By-Name-Schnittstelle zu Perls integrierten stat()-Funktionen – Perldoc-Browser

Der Code zum Ermitteln der Änderungszeit mithilfe einer Klasse lautet wie folgt:

#! /bin/perl -w
use strict;
use warnings;
use File::Find;
use File::stat;

my $time = stat("./logs/1.txt")->mtime;
print "$time\n";

Die Laufergebnisse sind wie folgt:

[fengbh@VM-16-14-centos perl_stat]$ ./check_logs.pl 
1703579691

3. Verwendung in File::Find

Dies wird mithilfe integrierter Funktionen implementiert.

#! /bin/perl -w
use strict;
use warnings;
use File::Find;

my $dir = "./logs";
find(\&process_files, $dir);

sub process_files{
    
    
    return if !-f $_;
    
    #debug
    print "\$_ = $_\n";
    print "\$File::Find::name = $File::Find::name\n\n";

    #get mtime
    my $mtime = (stat($File::Find::name))[10];
    die "Can't stat file;$!\n" if !defined($mtime);

    # debug
    print "mtime = $mtime\n";
}

Operationsergebnis:

[fengbh@VM-16-14-centos perl_stat]$ ./check_logs.pl 
$_ = 3.txt
$File::Find::name = ./logs/3.txt

Can't stat file;No such file or directory

Beim Ausführen wird ein Fehler gemeldet und die Datei kann nicht gefunden werden. Der an die Stat-Funktion übergebene Dateipfadname ist jedoch korrekt.

Dies liegt daran, dass die Suchfunktion das aktuelle Verzeichnis ändert, in dem das Programm ausgeführt wird , oder dass die Funktion „process_files“ im Verzeichnis $ dir ausgeführt wird .

Dies ist der Grund für den Fehler. $File::Find::name ist der Pfad relativ zum ursprünglichen Ausführungsverzeichnis und $_ ist der Pfad relativ zu $dir.

Ändern Sie den Code wie folgt:

#! /bin/perl -w
use strict;
use warnings;
use File::Find;

my $dir = "./logs";
find(\&process_files, $dir);

sub process_files{
    
    
    return if !-f $_;
    
    #debug
    print "\$_ = $_\n";
    print "\$File::Find::name = $File::Find::name\n\n";

    #get mtime
    my $mtime = (stat($_))[10];
    die "Can't stat file;$!\n" if !defined($mtime);

    # debug
    print "mtime = $mtime\n";
}

Die Ausführungsergebnisse sind wie folgt:

[fengbh@VM-16-14-centos perl_stat]$ ./check_logs.pl 
$_ = 3.txt
$File::Find::name = ./logs/3.txt

mtime = 1703577429
$_ = 1.txt
$File::Find::name = ./logs/1.txt

mtime = 1703579691
$_ = 2.txt
$File::Find::name = ./logs/2.txt

mtime = 1703577426

Das Ausführungsergebnis ist korrekt

Verweise

  1. Offizielle Dokumentation stellt stat vor – Perldoc-Browser
  2. Offizielle Dokumentation File::stat – By-Name-Schnittstelle zu Perls integrierten stat()-Funktionen – Perldoc-Browser
  3. „Einführung in die Perl-Sprache“

Supongo que te gusta

Origin blog.csdn.net/weixin_44681954/article/details/135226741
Recomendado
Clasificación