我的情况有 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。