Как скопировать символические ссылки в Perl? - PullRequest
5 голосов
/ 07 января 2009

Как мне скопировать символическую ссылку (а не файл, на который она указывает) в программе Perl, сохранив все атрибуты символической ссылки (например, владельца и разрешения)?

Ответы [ 3 ]

8 голосов
/ 07 января 2009

В 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

3 голосов
/ 07 января 2009

Модуль File :: Copy :: Recursive позаботится об этом. По умолчанию он будет копировать символические ссылки и пытаться сохранить право собственности.

0 голосов
/ 07 декабря 2018

В зависимости от вашего варианта использования относительно абсолютных и относительных целевых путей, иерархии каталогов и т. Д., Использование ссылка для создания жесткой ссылки на символическую ссылку, которую вы хотите скопировать, может быть уже достаточно. Никаких дополнительных пакетов не требуется, и Perl также поддерживает создание жестких ссылок на многих платформах.

...