因此,我有一个大约一千个符号链接从一个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/subdir
或mv 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
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 ../..
如果那仍然不合适,我会回到黑客:
现在,您可以将reorg / subdir移动到任何位置,因为这些符号链接使用绝对路径。并且,您可以将ref移动到任何您想要的位置,只要您随后将/ path / to / sym-dir吹走并重新创建它。
当然,fopen会抱怨你不得不经历两个层面的间接,但这可能是必须付出的代价。
HTH。