2011-12-15 5 views
22

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

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

+0

Вы все еще хотите, чтобы ссылки символичным при перемещении? Это влияет на ответы, которые вы получите. – fge

+0

А также вы все еще хотите, чтобы ссылки были относительными путями или меняли их на абсолютные пути? –

+0

Я думаю, что это относится к unix.stackexchange.com, хотя superuser.com также будет работать. –

ответ

26

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

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

EDIT:

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

+0

подтверждено на rhel5 – reconbot

8

Это 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; 
} 
0

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

~/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" 

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

1

можно использовать 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 
+1

Мог ли использовать tar-трубу чтобы сделать все это в одной команде '' cd folder_to_move; tar cf -. | (cd/usr/local/dest_folder; tar xf -) '' – Vorsprung

Смежные вопросы