web-dev-qa-db-ja.com

シンボリックリンクを再帰的に作成する

基本的にこのコマンドを実行したい...

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

これにより、フックと呼ばれるWebフォルダーの下のすべてのフォルダーにシンボリックリンクが作成されますが、エラーは返されませんが、実際にはシンボリックリンクは追加されません。

7
mschuett

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
6
Bratchley

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
Symfrog

lncpと少し似ています。引数が3つ以上ある場合、最後の引数はディレクトリとして扱われます。

From man ln

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

代わりにforループを使用する必要があります。

2
Mikel

周りを見回して、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
2
mschuett