基本的にこのコマンドを実行したい...
ln -s /opt/gitlab/embedded/service/gitlab-Shell/hooks/ /var/opt/gitlab/git-data/repositories/web/*/hooks
これにより、フックと呼ばれるWebフォルダーの下のすべてのフォルダーにシンボリックリンクが作成されますが、エラーは返されませんが、実際にはシンボリックリンクは追加されません。
find
オプションを使用してmaxdepth
コマンドを使用することをお勧めします。次のサンプルディレクトリ構造を作成しました。
/tmp/parent
/tmp/parent/subdir2
/tmp/parent/subdir1
/tmp/parent/subdir4
/tmp/parent/subdir4/notme
/tmp/parent/subdir3
notme
サブディレクトリではなく、各サブディレクトリに/tmp/hooks
へのシンボリックリンクを作成したいとします。
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
find
を使用すると、特定のパスの下にあるすべてのディレクトリのコンテキストでコマンドを実行できます。
次のコマンドは、ディレクトリ[/var/opt/gitlab/git-data/repositories/web/
)である-type d
の下のすべてのファイルを検索し、調査中の現在のディレクトリ({}
の-exec
で表される)に相対的なシンボリックリンクを作成します。 )
したがって、次のfind
コマンドは必要なことを実行します。
find /var/opt/gitlab/git-data/repositories/web/ -type d -exec ln /opt/gitlab/embedded/service/gitlab-Shell/hooks/ {}/hooks \;
ln
はcp
と少し似ています。引数が3つ以上ある場合、最後の引数はディレクトリとして扱われます。
From man ln :
ln [option]... target... directory
代わりにforループを使用する必要があります。
周りを見回して、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