2011-12-15 33 views
22

Mam wiele względnych dowiązań symbolicznych, które chcę przenieść do innego katalogu.Jak przenieść względne dowiązanie symboliczne?

Jak mogę przenosić dowiązania symboliczne (takie, które mają względną ścieżkę PATH), zachowując prawą ścieżkę?

+0

Czy nadal chcesz być linki symboliczne kiedy przeniósł? Ma to wpływ na odpowiedzi, które otrzymasz. – fge

+0

A czy nadal chcesz, aby linki były względne lub czy zmieniają je w ścieżki bezwzględne? –

+0

Myślę, że to należy na unix.stackexchange.com, ale superuser.com też by działał. –

Odpowiedz

26

Ścieżki względne można przekształcać w pełne ścieżki za pomocą readlink -f foo. Więc można zrobić coś takiego:

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

EDIT:

zauważyłem, że chcesz zachować ścieżki względne. W takim przypadku po przeniesieniu łącza można użyć symlinks -c, aby przekształcić ścieżki bezwzględne z powrotem w ścieżki względne.

+0

potwierdzone na rhel5 – reconbot

8

To perl rozwiązanie, które zachowuje ścieżek względnych:

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; 
} 
0

poprawiając Christopher Neylan za odpowiedź:

~/bin $ cat mv_ln 
#!/bin/bash 
# 
# inspired by https://stackoverflow.com/questions/8523159/how-do-i-move-a-relative-symbolic-link#8523293 
#   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" 

Jest to również część https://github.com/tpo/little_shell_scripts

1

można użyć tar przenieść folder zawierający względne dowiązania symboliczne.

Na przykład:

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 
+1

Można nawet użyć rury smołowej łańcuch, aby zrobić to wszystko w jednym poleceniu '' cd folder_to_move; tar cf -. | (cd/usr/local/dest_folder; tar xf -) '' – Vorsprung

Powiązane problemy