Bash 如何有效地更改大量符号链接集合的目标?

Bash 如何有效地更改大量符号链接集合的目标?,bash,symlink,batch-rename,Bash,Symlink,Batch Rename,因此,我有一个从一个Linux目录到一个同级目录的大约1000个符号链接的集合,用于在不复制文件的情况下重新组织一组文件 下面是一个模拟我的情况的3个文件: $ ls ref reorg -l ref: total 0 -rw-r----- 1 me 0 28 fév 11:57 a-foo.txt -rw-r----- 1 me 0 28 fév 11:57 b-bar.txt -rw-r----- 1 me 0 28 fév 11:57 c-baz.txt reorg: total 4 l

因此,我有一个从一个Linux目录到一个同级目录的大约1000个符号链接的集合,用于在不复制文件的情况下重新组织一组文件

下面是一个模拟我的情况的3个文件:

$ ls ref reorg -l
ref:
total 0
-rw-r----- 1 me 0 28 fév 11:57 a-foo.txt
-rw-r----- 1 me 0 28 fév 11:57 b-bar.txt
-rw-r----- 1 me 0 28 fév 11:57 c-baz.txt

reorg:
total 4
lrwxrwxrwx 1 me   16 28 fév 11:58 a.txt -> ../ref/a-foo.txt
lrwxrwxrwx 1 me   16 28 fév 11:58 b.txt -> ../ref/b-bar.txt
lrwxrwxrwx 1 me   16 28 fév 11:58 c.txt -> ../ref/c-baz.txt
现在,我意识到我应该创造一个更深层次的结构,所以我真正想要的是:

$ ls reorg/subdir/ -l
total 0
lrwxrwxrwx 1 me 19 28 fév 12:04 a.txt -> ../../ref/a-foo.txt
lrwxrwxrwx 1 me 19 28 fév 12:04 b.txt -> ../../ref/b-bar.txt
lrwxrwxrwx 1 me 19 28 fév 12:04 c.txt -> ../../ref/c-baz.txt
使用
cp-a reorg/*.txt reorg/subdir
mv reorg/*.txt reorg/subdir
将产生一系列断开的符号链接,因为它们将丢失额外的
。/
。由于在这些符号链接中编码了大量的重新组织工作,从头开始重新创建符号链接将是大量的工作

有人知道类似于
重命名
这样的解决方案,但它会系统地改变我的千个符号链接目标吗

显而易见的解决方案(我可能会这么做)是编写一个bash脚本,如下所示:

mv reorg/*.txt reorg/subdir
for l in reorg/subdir/*.txt; do
   newtarget=`readlink $l | sed 's/^/..\//'`
   ln -sf $newtarget $l
done
这是可行的,我进行了测试,但我希望有一个更直接的解决方案,类似于
重命名
,所以我不必每次遇到问题时都编写这样的脚本。我经常使用符号链接,所以这个问题会再次出现

这将是我的理想解决方案,如果它存在的话(使用CentOS类似重命名的语法,而不是Ubuntu语法,但两者都很好):


TL;DR:不,我不知道有像你描述的符号链接编辑器

现在,一个黑客:

cd reorg
ln -s ../ref .
我知道你不想每次都重新做for循环,但是你的
for
循环可以编辑数千个链接,也可以是一个for循环来重新创建数千个链接,不是吗

rm -rf reorg
mkdir reorg/subdir
cd reorg/subdir
for f in ../../ref/*.txt; do
   ln -s $f .
done
cd ../..
最后,着眼于“每次我面对这个问题”部分,考虑使用一个绝对路径在您的链接。然后,您可以将reorg/SUDBIR移动到任何需要的位置,并且路径仍然有效:

rm -rf reorg
mkdir reorg/subdir
cd reorg/subdir
for f in /absolute/path/to/ref/*.txt; do
   ln -s $f .
done
cd ../..
如果这仍然不令人满意,我将回到黑客:

  • 将文本文件放在已知目录(ref)中
  • 创建/path/to/sym dir,它是指向该目录的符号链接(ref)
  • 在reorg/subdir中创建符号链接,链接到/path/to/sym dir中的特定文件
现在,您可以将reorg/SUDBIR移动到任何需要的位置,因为这些符号链接使用绝对路径。而且,你可以把ref移动到任何你想移动的地方,只要你愿意 吹走/path/to/sym dir并重新创建它

当然,fopen会抱怨你必须经历两个间接层次,但这可能是必须付出的代价


HTH.

我在设置中包含了一个微妙之处,但没有明确表示,抱歉:链接与refs(a.txt->a-foo.txt)的名称不同,在我的实际情况中,refs位于一个复杂的目录结构中,reorg位于一个不同的、不太复杂但仍然不平坦的目录结构中。绝对路径当然会起作用,尽管它们会使整个结构稍后无法移动。黑客可能是最好的主意,我不介意fopen对我发牢骚(嗯,当事情进展缓慢时,也许我会介意,但我怀疑我会注意到……)PS:仍然希望有一个直接的
重命名链接目标的命令。我可能得自己写。。。
rm -rf reorg
mkdir reorg/subdir
cd reorg/subdir
for f in /absolute/path/to/ref/*.txt; do
   ln -s $f .
done
cd ../..