2009-01-07 6 views
5

Wie kopiere ich eine symbolische Verbindung (und nicht die Datei, auf die sie zeigt) in einem Perl-Programm, während alle symbolischen Verbindungsattribute (wie Besitzer und Berechtigungen) erhalten bleiben?Wie kopiere ich symbolische Links in Perl?

Danke, splintor

Antwort

8

In Perl können Sie die readlink() Funktion das Ziel eines symbolischen Link, um herauszufinden.

Sie können auch die Funktion lstat() verwenden, um die Berechtigungen des Symlinks zu lesen (im Gegensatz zu stat(), die die Details der Datei lesen, auf die der Symlink verweist).

Das Festlegen des Eigentumsrechts für den neuen Symlink kann nicht ohne zusätzliche Hilfe durchgeführt werden, da Perl den Systemaufruf lchown() nicht verfügbar macht. Dazu können Sie das Perl Modul von CPAN verwenden.

Unter der Annahme, ausreichende Berechtigungen (nb: nicht markiert Code)

use Lchown; 
my $old_link = 'path to the symlink'; 
my $new_link = 'path to the copy'; 

my $dst = readlink($old_link); 
my @stat = lstat($old_link); 

symlink $dst, $new_link; 
lchown $stat[4], $stat[5], $new_link; # set UID and GID from the lstat() results 

Sie brauchen nicht über die Berechtigungen für den Symlink zu kümmern - sie erscheinen immer als -rwxrwxrwx

+0

Danke. Ich habe nicht bemerkt, dass Symlinks keine echten Berechtigungen haben. Ich muss darüber nachdenken, wie dringend ich den Besitzer wechseln muss. – splintor

+0

Beachten Sie auch, dass, wenn der Inhalt des Symlinks ein _relative_ Pfad ist, er möglicherweise neu geschrieben werden muss, wenn die $ old_link und $ new_link nicht im selben Verzeichnis sind! – Alnitak

3

Das Modul File::Copy::Recursive Pflege nimmt davon . Standardmäßig werden Symlinks kopiert und versucht, den Besitz zu erhalten.

+1

Danke für den Zeiger. Ich habe es nicht in meiner Distribution, und ich muss überlegen, ob ich dieses Modul hinzufügen möchte. Ich sehe auch in der Quelle, dass der Besitzer der Datei nicht behandelt wird. Ich muss überdenken, wie wichtig es für mich ist. – splintor

+0

Ich stimme mit splintor überein - während dies funktioniert, ist das Modul nicht in der Standardinstallation, also wird es keine gute Lösung sein, wenn Sie vermeiden möchten, dass Ihre Benutzer Abhängigkeiten installieren müssen. – JosephH

Verwandte Themen