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