Como copio links simbólicos no Perl?
Pergunta
Como copio um link simbólico (e não o arquivo para o qual aponta) em um programa PERL, preservando todos os atributos de link simbólico (como proprietário e permissões)?
Solução
Em Perl, você pode usar o readlink()
Função para descobrir o destino de um symlink.
Você também pode usar o lstat()
função para ler as permissões do symlink (em oposição a stat()
que lerá os detalhes do arquivo apontado pelo symlink).
Na verdade, definir a propriedade no novo symlink não pode ser feita sem ajuda extra, pois Perl não expõe o lchown()
Chamada do sistema. Para isso, você pode usar o Perl Lchown
Módulo de CPAN.
Assumindo permissões suficientes (NB: código não controlado)
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
Você não precisa se preocupar com as permissões no symlink - elas sempre aparecem como -rwxrwxrwx
Outras dicas
O módulo Arquivo :: cópia :: recursivo cuida disso. Por padrão, ele copiará symblinks e tentará preservar a propriedade.
Dependendo do seu caso de uso em relação a caminhos alvo absolutos versus relativos, hierarquia de dir etc., usando link Para criar um link rígido para o symblink que você deseja copiar também pode ser suficiente. Não são necessários pacotes extras e a criação de links hardings é suportada pelo Perl em muitas plataformas também.