2011-12-15 19 views
22

Ho molti collegamenti simbolici relativi che voglio spostare in un'altra directory.Come si sposta un collegamento simbolico relativo?

Come posso spostare i collegamenti simbolici (quelli con un PERCORSO relativo) mantenendo il percorso corretto?

+0

Vuoi ancora i link per essere simbolico quando viene spostato? Questo ha un'influenza sulle risposte che otterrai. – fge

+0

E vuoi ancora che i link siano relativi a percorsi relativi, oppure li stai cambiando in percorsi assoluti ok? –

+0

Penso che questo appartenga a unix.stackexchange.com, anche se superuser.com funzionerebbe anche. –

risposta

26

È possibile trasformare i percorsi relativi in ​​percorsi completi utilizzando readlink -f foo. Così si dovrebbe fare qualcosa di simile:

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

EDIT:

ho notato che si desidera mantenere i percorsi relativi. In questo caso, dopo aver spostato il collegamento, è possibile utilizzare symlinks -c per riconvertire i percorsi assoluti in percorsi relativi.

+0

confermato su rhel5 – reconbot

8

questa è una soluzione perl che preserva i percorsi relativi:

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

migliorando la risposta di Christopher 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" 

Anche questo fa parte della https://github.com/tpo/little_shell_scripts

1

si può usare tar a muoversi una cartella contenente i relativi collegamenti simbolici.

Ad esempio:

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

Potrebbe anche usare un tubo di catrame catena per fare tutto in un unico comando '' cd folder_to_move; tar cf -. | (cd/usr/local/dest_folder; tar xf -) '' – Vorsprung

Problemi correlati