Ich habe viele relative symbolische Links, die ich in ein anderes Verzeichnis verschieben möchte.
Wie kann ich symbolische Links (solche mit einem relativen Pfad) verschieben, während der richtige Pfad beibehalten wird?
Sie können relative Pfade mit readlink -f foo
in vollständige Pfade umwandeln. Also würden Sie so etwas tun:
ln -s $(readlink -f $origlink) $newlink
rm $origlink
BEARBEITEN:
Ich habe festgestellt, dass Sie die Pfade relativ halten möchten. In diesem Fall können Sie nach dem Verschieben des Links symlinks -c
verwenden, um die absoluten Pfade wieder in relative Pfade umzuwandeln.
Dies ist eine Perl
-Lösung, die relative Pfade beibehält:
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;
}
Man kann tar
verwenden, um einen Ordner mit relativen symbolischen Links zu verschieben.
Zum Beispiel:
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
Verbesserung der Antwort von 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"
Dies ist auch Teil von https://github.com/tpo/little_Shell_scripts