У меня есть много относительных символических ссылок, которые я хочу переместить в другой каталог.Как перемещать относительную символическую ссылку?
Как я могу перемещать символические ссылки (с относительным PATH), сохраняя правильный путь?
У меня есть много относительных символических ссылок, которые я хочу переместить в другой каталог.Как перемещать относительную символическую ссылку?
Как я могу перемещать символические ссылки (с относительным PATH), сохраняя правильный путь?
Вы можете повернуть относительные пути в полные пути, используя readlink -f foo
. Таким образом, вы могли бы сделать что-то вроде:
ln -s $(readlink -f $origlink) $newlink
rm $origlink
EDIT:
Я заметил, что вы хотите сохранить пути относительны. В этом случае, после перемещения ссылки, вы можете использовать symlinks -c
, чтобы преобразовать абсолютные пути обратно в относительные пути.
подтверждено на rhel5 – reconbot
Это perl
решение, которое сохраняет относительные пути:
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;
}
Улучшение на ответ Кристофера 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"
Это также является частью https://github.com/tpo/little_shell_scripts
можно использовать tar
для перемещения папка, содержащая относительные символические ссылки.
Например:
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
Мог ли использовать tar-трубу чтобы сделать все это в одной команде '' cd folder_to_move; tar cf -. | (cd/usr/local/dest_folder; tar xf -) '' – Vorsprung
Вы все еще хотите, чтобы ссылки символичным при перемещении? Это влияет на ответы, которые вы получите. – fge
А также вы все еще хотите, чтобы ссылки были относительными путями или меняли их на абсолютные пути? –
Я думаю, что это относится к unix.stackexchange.com, хотя superuser.com также будет работать. –