Перезаписать символическую ссылку копией файла в perl - PullRequest
2 голосов
/ 16 августа 2011

Я думал, что видел ответ на этот вопрос раньше, но после поиска здесь и в Google я просто не могу его найти.

Как заменить существующую символическую ссылку на копию файла, на который она указывает? IE скопируйте исходный файл по ссылке.

Начните с этого

/path/to/file.txt
/link/path/file.txt -> /path/to/file.txt

Тогда назовите что-то вроде copy('/path/to/file.txt', '/link/path/file.txt'); и получите это:

/path/to/file.txt
/link/path/file.txt

Причина, по которой я не могу просто использовать copy(), заключается в том, что она, похоже, не поддерживает перезапись символической ссылки с ее исходным файлом, так как считает, что это одно и то же, и выдает ошибку "XXXXX и YYYYY идентичны ( не скопировано) "

Существует ли такой метод, как copy, который может перезаписать символическую ссылку копией исходного файла?

Ответы [ 2 ]

2 голосов
/ 16 августа 2011

Я не думаю, что это возможно с помощью одной команды. Вот решение, которое не включает переименование (вам, вероятно, следует добавить проверку ошибок):

$linkLoc = readlink('/link/path/file.txt');
unlink('/link/path/file.txt');
copy($linkLoc, '/link/path/file.txt');

Если вы обнаружите, что делаете это много, может оказаться целесообразным обернуть это в удобную функцию.

1 голос
/ 16 августа 2011

Я не думаю, что есть одна функция, которая может сделать это - если вы не напишите это самостоятельно.

Что я делаю:

  • Скопировать файл во временную папку в том же каталоге
  • Отключить файл
  • Переименуйте временное имя в оригинальное

(с проверкой ошибок на каждом шаге, конечно).

Если что-то пойдет не так, есть некоторый риск, что вы удалите символическую ссылку и не сможете ее заменить, но переименование должно быть достаточно безопасным (поскольку оно находится в том же каталоге, оно будет в той же файловой системе / разделе).

...