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?
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?
È 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.
confermato su rhel5 – reconbot
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;
}
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
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
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
Vuoi ancora i link per essere simbolico quando viene spostato? Questo ha un'influenza sulle risposte che otterrai. – fge
E vuoi ancora che i link siano relativi a percorsi relativi, oppure li stai cambiando in percorsi assoluti ok? –
Penso che questo appartenga a unix.stackexchange.com, anche se superuser.com funzionerebbe anche. –