如何复制相对符号链接并保留目标

如何复制相对符号链接并保留目标

我的情况有 2 个目录:/blah/d01 和 /blah/d02

$ls -l /blah/d01
a/
b/
c/
fa -> a
fb -> b
fc -> c

我想将 fa、fb、fc 复制到 /blah/d02,结果是:

$ls -l /blah/d02
fa -> ../d01/a
fb -> ../d01/b
fc -> ../d01/c

关键是,我想做一些类似 cp --{some magic attr} /blah/d01/f* /blah/d02/ 的事情来实现这一点。

谢谢

更新

我使用 bash 脚本来解决:

#! /bin/bash
for i in $@; do echo $i && [ -L $i ] && ln -s $(dirname $i)/$(readlink $i) $(basename $i); done

根据旧链接创建新链接(确保它们使用相对路径)

再次更新

我发现我的最后一个脚本可以工作,但是在将符号链接从 a 复制到 b 以及从 b 复制到 c 之后,链接路径会变得非常长(充满了奇怪的相对路径),所以我添加了清理相对路径,脚本结束:

#! /bin/bash
function relpath {
  source=$1
  target=$2

  common_part=$source
  back=
  while [ "${target#$common_part}" = "${target}" ]; do
    common_part=$(dirname $common_part)
    back="../${back}"
  done

  echo ${back}${target#$common_part/}
}

for i in $@; do echo $i && [ -L $i ] && ln -s $(relpath $PWD $(readlink -f $i)); done

答案1

由于这些符号链接是在没有完整限定路径的情况下创建的,因此很难做到这一点cp。但你宁愿在目标上创建新的符号链接:

for i in *; do [ -L $i ] && cd blah && ln -s ../$i $i && cd -; done

简短解释:

  • for i in *:循环遍历当前位置的文件/目录列表
  • do:概括必须做的事情
  • [ -L $i ] &&:仅当当前条目是符号链接时才继续
  • cd blah && ln -s ../$i $i && cd -:更改为 blah 并创建指向原始位置的符号链接

这还不是你想要的(因为它符号链接了符号链接)。所以我们将对其进行一些修改:

for i in *; do [ -L $i ] && cd blah && ln -s ../$(readlink ../$i) $i && cd -; done

添加的构造$(readlink ../$i)评估链接指向的对象,并将结果放在那里。瞧——结果就是您要找的。

请注意,我稍微简化了您的请求(使您只想将符号链接复制到子目录),因此更容易理解。您必须对其进行调整,因为我不假设您的真实目录名为blah:)

答案2

我认为你应该使用完整路径而不是相对路径

fx -> /full/path/to/x

因此,当您复制链接时它将始终显示 x。

相关内容