Как копировать символические ссылки в 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 на многих платформах.