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 find
comando usando la maxdepth
opció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/hooks
en cada subdirectorio pero no en el notme
subdirectorio:
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
find
se 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 find
comando 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
ln
funciona 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