2009-01-07 24 views

Respuesta

8

En Perl se puede utilizar la función readlink() para averiguar el destino de un enlace simbólico.

También puede usar la función lstat() para leer los permisos del enlace simbólico (a diferencia de stat() que leerá los detalles del archivo al que apunta el enlace simbólico).

En realidad, configurar la propiedad del nuevo enlace simbólico no se puede hacer sin ayuda adicional, ya que Perl no expone la llamada al sistema lchown(). Para eso, puede usar el módulo Perl Lchown de CPAN.

Suponiendo permisos suficientes (nb: sin control de código)

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 

Usted no necesita preocuparse por los permisos del enlace simbólico - que siempre aparecen como -rwxrwxrwx

+0

Gracias. No noté que los enlaces simbólicos no tienen permisos reales. Necesito pensar cuánto necesito que cambie el propietario. – splintor

+0

también tenga en cuenta que si el contenido del enlace simbólico es una ruta _relativa_, entonces puede ser necesario volver a escribir si $ old_link y $ new_link no están en el mismo directorio. – Alnitak

3

El módulo File::Copy::Recursive se encarga de eso . Por defecto, copiará enlaces simbólicos e intentará preservar la propiedad.

+1

Gracias por el puntero. No lo tengo en mi distribución, y necesito considerar si deseo agregar este módulo. También veo en la fuente que no se maneja el propietario del archivo. Necesito volver a pensar lo importante que es para mí. – splintor

+0

Estoy de acuerdo con splintor: mientras esto funciona, el módulo no está en la instalación predeterminada, por lo que no será una buena solución si desea evitar que los usuarios necesiten instalar dependencias. – JosephH

Cuestiones relacionadas