style link div attribute file shell unix directory symlink

file - link - td title html



enlace simbólico-copiando una jerarquía de directorios (7)

A partir de los directorios originales y nuevos, creo que este par de comandos find(1) hará lo que necesite:

find original -type d -exec mkdir new/{} /; find original -type f -exec ln -s {} new/{} /;

La primera instancia configura la estructura de directorios encontrando solo directorios en el árbol original y volviéndolos a crear en el nuevo árbol. El segundo crea los enlaces simbólicos a los archivos originales en el nuevo árbol.

¿Cuál es la forma más sencilla en Linux de "copiar" una jerarquía de directorios para que se cree una nueva jerarquía de directorios mientras que todos los "archivos" son solo enlaces simbólicos que apuntan a los archivos reales en la jerarquía de origen?

cp -s no funciona recursivamente.


Acabo de hacer una prueba rápida en una caja de Linux y cp -sR /orig /dest hace exactamente lo que describió: crea una jerarquía de directorios con enlaces simbólicos para los que no son directorios y vuelve al original.


Busqué en Google un poco y encontré un comando llamado lns , disponible desde here .


Sé que la pregunta era sobre shell, pero como puede llamar a perl desde shell, escribí una herramienta para hacer algo muy similar a esto y la publiqué en perlmonks hace unos años. En mi caso, generalmente quise que los directorios permanezcan en los enlaces hasta que decida lo contrario. Sería un cambio bastante trivial hacer esto de forma automática y recursiva.


Si tiene ganas de ensuciarse las manos, aquí hay un truco que creará automáticamente la carpeta de destino, las subcarpetas y los enlaces simbólicos de forma recursiva.

En la carpeta donde se encuentran los archivos que desea vincular y las subcarpetas:

  1. crear un archivo shell.sh:

    nano shell.sh

  2. Copia y pega este encantador:

#!/bin/bash

export DESTINATION=/your/destination/folder/ export TARGET=/your/target/folder/ find . -type d -print0 | xargs -0 bash -c ''for DIR in "$@"; do echo "${DESTINATION}${DIR}" mkdir -p "${DESTINATION}${DIR}" done'' - find . -type f -print0 | xargs -0 bash -c ''for file in "$@"; do ln -s "${TARGET}${file}" "${DESTINATION}${file}" done'' -

  1. guarda el archivo ctrl+O
  2. cerrar el archivo ctrl+X
  3. Haga su script ejecutable chmod 777 shell.sh

  4. Ejecute su script ./shell.sh

¡Feliz piratería!



cp -as /root/absolute/path/name dest_dir

Haré lo que quieras. Tenga en cuenta que el nombre de la fuente debe ser una ruta absoluta, no puede ser relativa. De lo contrario, obtendrá este error: "xyz-file: puede hacer enlaces simbólicos relativos solo en el directorio actual".

Además, tenga cuidado con lo que está copiando: si dest_dir ya existe, deberá hacer algo como:

cp -as /root/absolute/path/name/* dest_dir/ cp -as /root/absolute/path/name/.* dest_dir/