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

问题描述 投票:1回答:1

因此,我有一个大约一千个符号链接从一个Linux目录到一个兄弟目录的集合,用于重新组织一堆文件而不复制它们。

这是我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/subdirmv reorg/*.txt reorg/subdir会产生一堆破碎的符号链接,因为它们将缺少额外的../。由于在这些符号链接中编码的重组量很大,从头开始重新创建符号链接将会有很多工作。

有没有人知道像rename这样的解决方案,但会系统地改变我的千个符号链接目标?

显而易见的解决方案(也可能是我要做的)是编写一个这样的bash脚本:

mv reorg/*.txt reorg/subdir
for l in reorg/subdir/*.txt; do
   newtarget=`readlink $l | sed 's/^/..\//'`
   ln -sf $newtarget $l
done

这是有效的,我测试过,但我希望有一个更直接的解决方案,类似于rename,所以每次我遇到问题时我都不必编写这样的脚本。我经常使用符号链接,所以这个问题会再次出现。

这将是我理想的解决方案,如果它存在(使用CentOS重命名式语法,而不是Ubuntu语法,但要么是好的):

mv reorg/*.txt reorg/subdir
rename-link-targets ../ ../../ reorg/subdir/*.txt
bash symlink batch-rename
1个回答
1
投票

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 / subdir,路径仍然有效:

rm -rf reorg
mkdir reorg/subdir
cd reorg/subdir
for f in /absolute/path/to/ref/*.txt; do
   ln -s $f .
done
cd ../..

如果那仍然不合适,我会回到黑客:

  • 将您的文本文件放在已知目录中(参考)
  • create / path / to / sym-dir,是该目录的符号链接(ref)
  • 在reorg / subdir中创建符号链接,链接到/ path / to / sym-dir中的特定文件

现在,您可以将reorg / subdir移动到任何位置,因为这些符号链接使用绝对路径。并且,您可以将ref移动到任何您想要的位置,只要您随后将/ path / to / sym-dir吹走并重新创建它。

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

HTH。

© www.soinside.com 2019 - 2024. All rights reserved.