2 Stimmen

Perl File::Find duplizierte Namen

Ich verwende das Perl-Modul File::Find, um ein Verzeichnis zu durchsuchen. Dieses Verzeichnis ist eine NFS-Freigabe, die das Verzeichnis .snapshot enthält. In diesem Verzeichnis befindet sich ein Schnappschuss der gestrigen Dateistruktur und somit sind Verzeichnisse mit dem gleichen Namen im Ergebnis enthalten. Daher erhalte ich den folgenden Fehler:

[folder_in_which_find_is_executed].snapshot/sv_daily.0 encountered a second time at /usr/lib/perl5/5.8.8/File/Find.pm line 566.

Gibt es eine Möglichkeit, dies zu verhindern, z. B. durch Entfernen des doppelten Eintrags?

Dies ist der Untercode, der die Suche ausführt:

sub process()
{
        my ($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size,
            $atime, $mtime, $ctime, $blksize, $blocks) = stat $_;
        my $type = (-f _ ? 'f' : (-d _ ? 'd' : '*'));
        my ($md5sum);

        if (!defined $dev)
        {
                if (-l $_)
                {
                        die "Broken symbolic link: $File::Find::name";
                } else {
                        die "Error processing $type '$File::Find::name'";
                }
        }

        my $name = $File::Find::name;
        $name =~ s|^\.\/?||;

        if ($name ne '')
        {
                $db->{$name} = {
                        name => $name,
                        mode => sprintf("%04o", $mode & 07777),
                        user_id => $uid,
                        group_id => $gid,
                        last_modified => $mtime,
                        type => $type
                };

                if ($type eq 'f')
                {
                        $db->{$name}->{size} = $size;
                        $db->{$name}->{inode} = $ino;
                        $md5sum = SumForEntry($name, $_);
                        $db->{$name}->{md5sum} = $md5sum;
                }
        }
}

Die folgende Zeile führt dieses Unterprogramm aus:

find({ wanted => \&process, follow => 1}, '.');

Kann mir bitte jemand helfen?

1voto

Jonathan Leffler Punkte 694013

Die Funktion "Gesucht" kann folgende Informationen liefern File::Find um seine Suche einzuschränken:

Die Funktion kann $File::Find::prune setzen, um den Baum zu beschneiden, wenn nicht bydepth angegeben wurde.

Setzen Sie beim Eintritt in das Snapshot-Verzeichnis die Variable prune, um die weitere Verarbeitung des Verzeichnisses zu verhindern.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X