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

У меня много относительных символических ссылок, которые я хочу переместить в другой каталог.

Как я могу переместить символические ссылки (имеющие относительный путь), сохранив правильный путь?

Ответы [ 4 ]

28 голосов
/ 15 декабря 2011

Вы можете превратить относительные пути в полные, используя readlink -f foo. Так что вы бы сделали что-то вроде:

ln -s $(readlink -f $origlink) $newlink
rm $origlink

EDIT:

Я заметил, что вы хотите сохранить относительные пути. В этом случае после перемещения ссылки можно использовать symlinks -c для преобразования абсолютных путей обратно в относительные пути.

8 голосов
/ 15 декабря 2011

Это perl решение, которое сохраняет относительные пути:

use strictures;
use File::Copy qw(mv);
use Getopt::Long qw(GetOptions);
use Path::Class qw(file);
use autodie qw(:all GetOptions mv);

my $target;
GetOptions('target-directory=s' => \$target);
die "$0 -t target_dir symlink1 symlink2 symlink3\n" unless $target && -d $target;

for (@ARGV) {
    unless (-l $_) {
        warn "$_ is not a symlink\n";
        next;
    }
    my $newlink = file(readlink $_)->relative($target)->stringify;
    unlink $_;
    symlink $newlink, $_;
    mv $_, $target;
}
2 голосов
/ 31 августа 2016

Можно использовать tar для перемещения папки, содержащей относительные символические ссылки.

Например:

cd folder_to_move/..
tar czvf files.tgz folder_to_move
cd dest_folder/..
tar xzvf /absolute/path/to/folder_to_move/../files.tgz

# If all is fine, clean-up
rm /absolute/path/to/folder_to_move/../files.tgz
rm -rf /absolute/path/to/folder_to_move
0 голосов
/ 28 мая 2015

Улучшение ответа Кристофера Нейлана:

~/bin $ cat mv_ln
#!/bin/bash
#
# inspired by /5082713/kak-mne-peremestit-otnositelnuy-simvolicheskuy-ssylku#5082724
#          by Christopher Neylan

help() {
   echo 'usage: mv_ln src_ln dest_dir'
   echo '       mv_ln --help'
   echo
   echo '  Move the symbolic link src_ln into dest_dir while'
   echo '  keeping it relative'
   exit 1
}

[ "$1" == "--help" ] || [ ! -L "$1" ] || [ ! -d "$2" ] && help

set -e # exit on error

orig_link="$1"
orig_name=$( basename    "$orig_link" )
orig_dest=$( readlink -f "$orig_link" )
dest_dir="$2"

ln -r -s "$orig_dest" "$dest_dir/$orig_name"
rm "$orig_link"

Это также часть https://github.com/tpo/little_shell_scripts

...