Crear enlace simbólico de forma recursiva

Crear enlace simbólico de forma recursiva

Básicamente quiero ejecutar este comando...

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

Esto crearía un enlace simbólico en todas las carpetas de la carpeta web llamado ganchos; sin embargo, no devuelve errores, pero en realidad no agrega el enlace simbólico.

Respuesta1

Probablemente quieras usar el findcomando usando la maxdepthopción. Creé esta estructura de directorio de muestra:

/tmp/parent
/tmp/parent/subdir2
/tmp/parent/subdir1
/tmp/parent/subdir4
/tmp/parent/subdir4/notme
/tmp/parent/subdir3

Digamos que quería crear un enlace simbólico /tmp/hooksen cada subdirectorio pero no en el notmesubdirectorio:

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

Respuesta2

findse puede utilizar para ejecutar un comando en el contexto de cada directorio en una ruta específica.

El siguiente comando busca todos los archivos /var/opt/gitlab/git-data/repositories/web/que están en directorios ( -type d) y crea un enlace simbólico relativo al directorio actual que está examinando (representado por {}en -exec).

Entonces el siguiente findcomando hará lo que necesites:

find /var/opt/gitlab/git-data/repositories/web/ -type d -exec ln /opt/gitlab/embedded/service/gitlab-shell/hooks/ {}/hooks \;

Respuesta3

lnfunciona un poco como cp. Si hay más de dos argumentos, el último se trata como un directorio.

Dehombre en:

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

Necesitarás usar un bucle for en su lugar.

Respuesta4

Después de mirar a mi alrededor y jugar con el comando buscar, descubrí que era más fácil recorrer las cosas usando ./*/. ¡Gracias por toda la ayuda! Hice un script en mi cuenta de github que está mucho más ajustado. Aunque es específico de gitlab, solo tomará unos minutos modificarlo para lo que necesites.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

información relacionada