¿Cómo copio un enlace simbólico (y no el archivo al que apunta) en un programa Perl conservando todos los atributos del enlace simbólico (como propietario y permisos)?¿Cómo copio enlaces simbólicos en Perl?
Gracias, splintor
¿Cómo copio un enlace simbólico (y no el archivo al que apunta) en un programa Perl conservando todos los atributos del enlace simbólico (como propietario y permisos)?¿Cómo copio enlaces simbólicos en Perl?
Gracias, splintor
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
El módulo File::Copy::Recursive se encarga de eso . Por defecto, copiará enlaces simbólicos e intentará preservar la propiedad.
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
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
Gracias. No noté que los enlaces simbólicos no tienen permisos reales. Necesito pensar cuánto necesito que cambie el propietario. – splintor
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