it-swarm.com.de

Wie verschiebe ich einen relativen symbolischen Link?

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?

25
anasdox

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.

28

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;
}
8
daxim

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
2
ttq

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

0