2010-12-21 13 views
1

Ich benutze Perl-Modul Datei :: Finden, um quer durch ein Verzeichnis zu durchlaufen. Dieses Verzeichnis ist eine NFS-Freigabe mit dem Verzeichnis .snapshot. In diesem Ordner befindet sich eine Momentaufnahme der alten Dateistruktur und somit Verzeichnisse mit dem gleichen Namen im Ergebnis. ich daher die folgenden Fehler:
Perl-Datei :: Finde doppelte Namen

[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, zum Beispiel geschieht durch Entfernen des doppelten Eintrags?

Dies ist der Code-Unter, die die Entdeckung fü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 diese Unter:

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

Kann jemand bitte helfen Sie mir?

+0

Lager Frage: Warum verwenden Sie den leeren Prototyp? – Hugmeir

+0

@ Hugmeir: warum nicht? File :: Find manual sagt _Die gewünschte Funktion braucht keine Argumente, sondern ihre Arbeit durch eine Sammlung von Variablen._ –

+0

@ Jonathan Leffler: Ich habe nicht gefragt, weil es falsch war, nur weil es in der Regel schlechte Form ist. Wenn er das aus den Dokumenten zitierte, ist das alles in Ordnung und gut, er weiß, wie Prototypen funktionieren. Wenn er es nicht wüsste, würde er es wahrscheinlich später wieder benutzen und einen schwer zu findenden Fehler erzeugen. tl; dr: Für mich stellt die Frage "Warum benutzt du Prototypen?" ähnliche Fragen wie "Warum benutzt du nicht streng?". – Hugmeir

Antwort

1

Die ‚wollte‘ Funktion kann File::Find sagen seine Suche zu beschneiden:

auf den Snapshot-Verzeichnis

The function may set $File::Find::prune to prune the tree unless bydepth was specified.

Beim Eintritt, setzen Sie die Variable Prune Weiterverarbeitung zu verhindern.

+0

Danke, das hat das Problem behoben! – mmjmanders

Verwandte Themen