Eu essencialmente quero executar este comando ...
ln -s /opt/gitlab/embedded/service/gitlab-shell/hooks/ /var/opt/gitlab/git-data/repositories/web/*/hooks
Isso criaria um link simbólico em todas as pastas da pasta da web chamada hooks, no entanto, não retorna erros, mas na verdade não adiciona o link simbólico.
Responder1
Você provavelmente desejará usar o find
comando usando a maxdepth
opção. Eu criei esta estrutura de diretórios de exemplo:
/tmp/parent
/tmp/parent/subdir2
/tmp/parent/subdir1
/tmp/parent/subdir4
/tmp/parent/subdir4/notme
/tmp/parent/subdir3
Digamos que eu queira criar um link simbólico /tmp/hooks
em cada subdiretório, mas não no notme
subdiretório:
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
Responder2
find
pode ser usado para executar um comando no contexto de cada diretório em um caminho específico.
O comando a seguir procura todos os arquivos /var/opt/gitlab/git-data/repositories/web/
que são diretórios ( -type d
) e cria um link simbólico relativo ao diretório atual que está examinando (representado por {}
in -exec
)
Portanto, o seguinte find
comando fará o que você precisa:
find /var/opt/gitlab/git-data/repositories/web/ -type d -exec ln /opt/gitlab/embedded/service/gitlab-shell/hooks/ {}/hooks \;
Responder3
ln
funciona um pouco como cp
. Se houver mais de dois argumentos, o último será tratado como um diretório.
Dehomem ln:
ln [option]... target... directory
Você precisará usar um loop for.
Responder4
Depois de olhar em volta e brincar com o comando find, descobri que era mais fácil fazer um loop nas coisas usando ./*/
. Obrigado por toda a ajuda! Fiz um script na minha conta do github que é muito mais ajustado. Embora seja específico do gitlab Levaria apenas alguns minutos para modificá-lo para o que você precisarhttps://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