递归创建符号链接

递归创建符号链接

我本质上想运行这个命令......

ln -s /opt/gitlab/embedded/service/gitlab-shell/hooks/ /var/opt/gitlab/git-data/repositories/web/*/hooks

这将在 Web 文件夹下的所有文件夹中创建一个名为 hooks 的符号链接,但它不会返回任何错误,但实际上不会添加符号链接。

答案1

您可能希望find通过该maxdepth选项来使用该命令。我创建了这个示例目录结构:

/tmp/parent
/tmp/parent/subdir2
/tmp/parent/subdir1
/tmp/parent/subdir4
/tmp/parent/subdir4/notme
/tmp/parent/subdir3

假设我想/tmp/hooks在每个子目录中创建一个符号链接,但不是notme子目录:

root@xxxxxxvlp12 ~ $ find /tmp/parent -type d -maxdepth 1 -exec ln -s /tmp/hooks {} \;
root@xxxxxxvlp12 ~ $ find /tmp/parent -ls
2490378    4 drwxr-xr-x   6 root     root         4096 Oct  7 12:39 /tmp/parent
2490382    4 drwxr-xr-x   2 root     root         4096 Oct  7 12:39 /tmp/parent/subdir2
2490394    0 lrwxrwxrwx   1 root     root           10 Oct  7 12:39 /tmp/parent/subdir2/hooks -> /tmp/hooks
2490379    4 drwxr-xr-x   2 root     root         4096 Oct  7 12:39 /tmp/parent/subdir1
2490395    0 lrwxrwxrwx   1 root     root           10 Oct  7 12:39 /tmp/parent/subdir1/hooks -> /tmp/hooks
2490389    4 drwxr-xr-x   3 root     root         4096 Oct  7 12:39 /tmp/parent/subdir4
2490390    4 drwxr-xr-x   2 root     root         4096 Oct  7 12:38 /tmp/parent/subdir4/notme
2490396    0 lrwxrwxrwx   1 root     root           10 Oct  7 12:39 /tmp/parent/subdir4/hooks -> /tmp/hooks
2490387    4 drwxr-xr-x   2 root     root         4096 Oct  7 12:39 /tmp/parent/subdir3
2490397    0 lrwxrwxrwx   1 root     root           10 Oct  7 12:39 /tmp/parent/subdir3/hooks -> /tmp/hooks
2490391    0 lrwxrwxrwx   1 root     root           10 Oct  7 12:39 /tmp/parent/hooks -> /tmp/hooks

答案2

find可用于在特定路径下的每个目录的上下文中执行命令。

以下命令查找/var/opt/gitlab/git-data/repositories/web/目录 ( -type d) 下的所有文件,并创建相对于它正在检查的当前目录的符号链接(由{}in表示-exec

因此以下find命令将满足您的要求:

find /var/opt/gitlab/git-data/repositories/web/ -type d -exec ln /opt/gitlab/embedded/service/gitlab-shell/hooks/ {}/hooks \;

答案3

ln工作原理有点像cp.如果有两个以上的参数,则最后一个被视为目录。

曼林:

ln [option]... target... directory

您需要使用 for 循环。

答案4

在环顾四周并使用 find 命令后,我发现使用循环遍历内容更容易./*/.感谢您的帮助!我在我的 github 帐户上制作了一个更加精细的脚本。虽然它是 gitlab 特定的,但只需几分钟即可根据您的需要修改它https://github.com/michaeljs1990/bash-scripts/blob/master/gitlab-hooks-migration.sh

#!/bin/bash

find . -name "hooks" -type l -delete

hooks="hooks"
for i in ./*/; do
    ln -s  /opt/gitlab/embedded/service/gitlab-shell/hooks/ $i$hooks
done

相关内容