Bash 如何有效地更改大量符号链接集合的目标?
因此,我有一个从一个Linux目录到一个同级目录的大约1000个符号链接的集合,用于在不复制文件的情况下重新组织一组文件 下面是一个模拟我的情况的3个文件: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
$ 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中的特定文件
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 ../..