Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何移动相对符号链接?_Linux_Perl_Shell_Unix_Symlink - Fatal编程技术网

Linux 如何移动相对符号链接?

Linux 如何移动相对符号链接?,linux,perl,shell,unix,symlink,Linux,Perl,Shell,Unix,Symlink,我有很多相对的符号链接,我想移动到另一个目录 如何在保留正确路径的同时移动符号链接(具有相对路径的链接)?您可以使用readlink-f foo将相对路径转换为完整路径。所以你可以这样做: ln -s $(readlink -f $origlink) $newlink rm $origlink 编辑: 我注意到您希望保持路径的相对性。在这种情况下,移动链接后,可以使用symlinks-c将绝对路径转换回相对路径。这是一种保留相对路径的perl解决方案: use strictures; use

我有很多相对的符号链接,我想移动到另一个目录


如何在保留正确路径的同时移动符号链接(具有相对路径的链接)?

您可以使用
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;
}

改进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"

这也是的一部分,可以使用
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

使用
ln
当然:

for i in *; do # or whatever pattern you're wanting to match
    ln -sr "$(readlink "$i")" newdir/"$i";
done;

我很惊讶这能起作用,但是
LN(1)
必须足够聪明,能够注意到正在发生的事情并帮助您!我甚至用一个名为“newdir”的
。/somethingelse
(在重新编写链接时应该是不可操作的)和
(它将从链接目标中删除一个
),它工作得非常好。

你还希望链接在移动时是符号化的吗?这对您将得到的答案有影响。您是否仍然希望链接指向相对路径,还是将其更改为绝对路径?我认为这属于unix.stackexchange.com,尽管superuser.com也可以使用。@fgr yes,我想保留相对的符号链接,例如../../dir/sym将更改为../../dir/sym甚至可以使用tar管道链在一个命令
cd folder\u to\u move;焦油cf-.|(cd/usr/local/dest_folder;tar xf-
它似乎对我不起作用。“tar”重写相对符号链接的具体方式和时间?您还可以使用
ln
-r
选项创建相对链接,即
ln-sr“$(readlink-f“$origlink”)“$newlink”;rm“$origlink”
。注意:如果origlink不存在,则会创建垃圾链接。如果没有可用的
symlinks
实用程序,则应正确引用
ln-rs“$(readlink-f“$origlink”)“”“$newlink”
,您可以使用
ln
-r
选项将现有绝对符号链接转换为相对符号链接<代码>项次-srf$newlink。或者按照@Robin479的建议做,在第一步中创建一个相对符号链接。您忘记了
$(…)
@ctrl-alt-delor周围的一些引号-您能举例说明
$()
会产生负面/意外的影响吗?在相同的情况下,如果从
源链接=“$1”
中漏掉它们。我只是做了一些测试,但我无法让它中断,可能是因为我只是出于习惯而把它们放进去,因为我发现记住一个简单的规则比记住一组规则更容易,它可以避免错误。分配给变量时不需要引号。这不是一个坏习惯,但不是必须的。