Как преобразовать символическую ссылку в обычный файл? - PullRequest
49 голосов
/ 04 декабря 2011

Какой самый прямой способ преобразовать символическую ссылку в обычный файл (т. Е. Копию цели символической ссылки)?

Предположим, filename является символической ссылкой на target.Очевидная процедура для превращения его в копию:

cp filename filename-backup
rm filename
mv filename-backup filename

Есть ли более прямой путь (т. Е. Одна команда)?

Ответы [ 14 ]

0 голосов
/ 08 сентября 2016

Другой подход, если вам часто приходится этим заниматься, - это адаптировать ответ kbrock в скрипт оболочки и поместить его в / usr / bin /. Что-то вроде:

if [ $# -ne 1 ] 
then
  echo "Usage: $0 filename"
  exit 1
fi
[ -L "$1" ] && cp --remove-destination "$(readlink "$1")" "$1"

chmod + x it, а затем просто запустите его как обычную команду.

0 голосов
/ 10 марта 2016

в случае «относительных» символических ссылок вы можете добавить оператор awk в ответ @jared:

for f in $(find . -type l); do /bin/cp -rf --remove-destination -f $(find . \! -type l -name $(readlink $f | awk -F"../" '{print $NF}')) $f;done;

Если у вас есть символические ссылки, указывающие на каталоги, вам нужно использовать более радикальный подход, потому что cp --remove-destination не работает вместе с каталогами символических ссылок правильно

for f in `find . -type l`; do (cd `dirname $f`; target=`basename $f`; source=`readlink $target` ; rm -rf $target && cp -r $source $target); done

Конечно, это может быть написано с меньшими издержками.но, на мой взгляд, читать неплохо.

0 голосов
/ 26 июля 2014

Rsync может навязать вам символическую ссылку, используя флаг -L.

[user@workstation ~]$ rsync -h | grep -- -L
 -L, --copy-links            transform symlink into referent file/dir

Это было бы так просто: rsync -L <symlink> <destination>

0 голосов
/ 04 декабря 2011

Нет единой команды. Но если вам не нужна копия, и все, что вам нужно - это еще одна ссылка, вы можете заменить символическую ссылку ссылкой (она же «жесткая ссылка»). Это работает, только если они находятся в одном разделе, кстати.

rm filename
ln target filename
...