2009-01-07 8 views
5

Comment puis-je copier un lien symbolique (et non le fichier vers lequel il pointe) dans un programme Perl tout en préservant tous les attributs du lien symbolique (tels que le propriétaire et les permissions)?Comment copier des liens symboliques en Perl?

Merci, splintor

Répondre

8

En Perl, vous pouvez utiliser la fonction readlink() pour savoir la destination d'un lien symbolique.

Vous pouvez également utiliser la fonction lstat() pour lire les autorisations du lien symbolique (par opposition à stat() qui lira les détails du fichier pointé par le lien symbolique).

En réalité, la définition de la propriété sur le nouveau lien symbolique ne peut pas être effectuée sans aide supplémentaire car Perl n'expose pas l'appel système lchown(). Pour cela, vous pouvez utiliser le module Perl Lchown du CPAN.

En supposant des autorisations suffisantes (nb: le code sans contrôle)

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 

Vous n'avez pas besoin de vous soucier des autorisations sur le lien symbolique - ils apparaissent toujours comme -rwxrwxrwx

+0

Merci. Je n'ai pas remarqué que symlinks n'a pas de véritables permissions. Je dois penser à quel point j'ai besoin que le propriétaire change. – splintor

+0

notez également que si le contenu du lien symbolique est un chemin _relative_, alors il peut être nécessaire de réécrire si $ old_link et $ new_link ne sont pas dans le même répertoire! – Alnitak

3

Le module File::Copy::Recursive prend soin de cette . Par défaut, il va copier les liens symboliques et essayer de préserver la propriété.

+1

Merci pour le pointeur. Je ne l'ai pas dans ma distribution, et je dois considérer si je veux ajouter ce module. Je vois aussi dans la source que le propriétaire du fichier n'est pas manipulé. J'ai besoin de repenser à quel point c'est important pour moi. – splintor

+0

Je suis d'accord avec splintor - bien que cela fonctionne, le module n'est pas dans l'installation par défaut donc ce ne sera pas une bonne solution si vous voulez éviter que vos utilisateurs ont besoin d'installer des dépendances. – JosephH

Questions connexes