Criando link simbólico recursivamente

4

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, chamadas de ganchos, no entanto, não retorna erros, mas, na verdade, não adiciona o link simbólico.

    
por mschuett 07.10.2014 / 18:30

4 respostas

6

Você provavelmente desejará usar o comando find usando a opção maxdepth . Eu criei esta estrutura de diretório 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 para /tmp/hooks em cada subdir, mas não no notme subdir:

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
    
por 07.10.2014 / 18:40
3

find pode ser usado para executar um comando no contexto de cada diretório sob um caminho específico.

O comando a seguir procura todos os arquivos em /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 comando find a seguir 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 \;
    
por 07.10.2014 / 18:46
2

ln funciona um pouco como cp . Se houver mais de dois argumentos, o último é tratado como um diretório.

Em homem :

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

Você precisará usar um loop for.

    
por 07.10.2014 / 18:38
1

Depois de olhar em volta e brincar com o comando find, descobri que era mais fácil apenas fazer um loop sobre as coisas usando ./*/ . Obrigado por toda a ajuda! Fiz um script na minha conta do github que está muito mais bem ajustado. Embora seja específico do gitlab Só levaria alguns minutos para modificá-lo para o que você precisa link .

#!/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
    
por 07.10.2014 / 19:38