我本质上想运行这个命令......
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
答案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