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.
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:
crear un archivo shell.sh:
nano shell.sh
- 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'' -
- guarda el archivo
ctrl+O
- cerrar el archivo
ctrl+X
Haga su script ejecutable
chmod 777 shell.sh
Ejecute su script
./shell.sh
¡Feliz piratería!
También está la utilidad "lndir" (de X) que hace tal cosa; Lo encontré mencionado aquí: Informe de error de Debian # 301030: ¿podemos mover lndir a coreutils o debianutils? , y ahora lo estoy usando felizmente.
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/