Как скопировать символическую ссылку (а не файл, на который она указывает) в программе Perl, сохранив при этом все атрибуты символической ссылки (например, владельца и разрешения)?
Как копировать символические ссылки в Perl?
Ответ 1
В Perl вы можете использовать функцию readlink()
, чтобы узнать назначение символической ссылки.
Вы также можете использовать функцию lstat()
для чтения разрешений символической ссылки (в отличие от stat()
, которая будет читать детали файла, на который указывает символическая ссылка).
Фактически установка права собственности на новую символическую ссылку не может быть выполнена без дополнительной помощи, поскольку Perl не выдает системный вызов lchown()
. Для этого вы можете использовать модуль Perl Lchown
из CPAN.
Предполагая достаточные разрешения (nb: непроверенный код)
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
Вам не нужно беспокоиться о правах на символическую ссылку - они всегда отображаются как -rwxrwxrwx
Ответ 2
Модуль File:: Copy:: Recursive позаботится об этом. По умолчанию он копирует символические ссылки и пытается сохранить право собственности.
Ответ 3
В зависимости от вашего варианта использования относительно абсолютных и относительных целевых путей иерархия dir и т.д., Используя ссылку для создания жесткой ссылки на символическую ссылку, которую вы хотите скопировать, может быть уже достаточно. Никаких дополнительных пакетов и создания жестких ссылок не поддерживается Perl на многих платформах.