基本的にこのコマンドを実行したいのですが...
ln -s /opt/gitlab/embedded/service/gitlab-shell/hooks/ /var/opt/gitlab/git-data/repositories/web/*/hooks
これにより、hooks という Web フォルダーの下にあるすべてのフォルダーにシンボリック リンクが作成されますが、エラーは返されず、実際にはシンボリック リンクは追加されません。
答え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
)にあるすべてのファイルを検索し、現在調べているディレクトリ({}
ではで表されます-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
。引数が 2 つ以上ある場合、最後の引数はディレクトリとして扱われます。
から男 ln:
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