Как переместить относительную символическую ссылку?
У меня есть много относительных символических ссылок, которые я хочу переместить в другой каталог.
Как я могу перемещать символические ссылки (те, которые имеют относительный путь), сохраняя правильный путь?
4 ответа:
Относительные пути можно превратить в полные с помощью
readlink -f foo
. Поэтому вы сделаете что-то вроде:ln -s $(readlink -f $origlink) $newlink rm $origlink
Правка:
Я заметил, что вы хотите сохранить относительность путей. В этом случае, после перемещения ссылки, вы можете использоватьsymlinks -c
для преобразования абсолютных путей обратно в относительные пути.
Это решение
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; }
Можно использовать
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
Улучшение ответа Кристофера Нейлана:
~/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