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ę?
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ę?
Ś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.
potwierdzone na rhel5 – reconbot
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;
}
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
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
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
Czy nadal chcesz być linki symboliczne kiedy przeniósł? Ma to wpływ na odpowiedzi, które otrzymasz. – fge
A czy nadal chcesz, aby linki były względne lub czy zmieniają je w ścieżki bezwzględne? –
Myślę, że to należy na unix.stackexchange.com, ale superuser.com też by działał. –