2009-08-06 12 views
19

¿Cuál es la forma más simple en Linux para "copiar" una jerarquía de directorios para crear una nueva jerarquía de directorios mientras todos los "archivos" son simplemente enlaces simbólicos a los archivos reales en la jerarquía de origen?symlink-copiando una jerarquía de directorio

cp -s no funciona recursivamente.

+0

Véase también http://unix.stackexchange.com/q/196537/10047. – user905686

Respuesta

1

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

+0

Esta herramienta funciona muy bien para mí. ¡Gracias por mencionarlo! –

+0

¿Por qué recomiendas una herramienta de terceros si cp con algunas (2) opciones es suficiente? Me parece un riesgo de seguridad para mí. – Nikodemus

+0

Porque no sabía acerca de la opción -s hace ocho años cuando escribí la respuesta. Siéntase libre de votar/votar si cree que la respuesta es buena/mala. – JesperE

11

Comenzando desde arriba los originales & nuevos directorios, creo que este par de find(1) comandos hará lo que usted necesita:

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

La primera instancia establece la estructura de directorios mediante la búsqueda sólo directorios en el árbol original y recreándolos en el nuevo árbol. El segundo crea los enlaces simbólicos a los archivos originales en el nuevo árbol.

+0

Esto funciona muy bien para mí (como se indica anteriormente, cp-as o -Rs no funcionarán en Mac OS X). Puede ser una buena idea '(cd origParentDir; find origDir ...; find origDir ..)' para obtener la ruta relativa como parámetro tanto para mkdir como para ln -s. Use parantheses para iniciar '(' subshell') 'porque ejecutar cd en una subshell solo establecerá temporalmente CWD; CWD se restaura cuando sale la subshell. P.ej. si está "clonando" '/ src/binutils-2.24' en' $ {HOME}/source', entonces no desea que se cree la carpeta '' src' '. –

+0

Es extraño que 'ln' no tenga una opción recursiva ... como' ln -s -R orig/dir dest/dir'. – jiggunjer

26

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

+0

Solo funciona en el primer nivel de directorio. Para cada archivo en subdirectorios obtengo "xyz-file: solo puedo hacer enlaces simbólicos relativos en el directorio actual". (en Ubuntu 8.10, cp versión 6.10) –

+24

La razón por la que obtiene "xyz-file: puede hacer enlaces simbólicos relativos solo en el directorio actual" es porque para el directorio de origen, especificó una ruta relativa. Funcionará como lo desee si especifica una ruta absoluta para el origen, como por ejemplo: "cp -sR/root/absolute/path/name dest". – PonyEars

+3

En caso de que necesite/quiera hacer que todos los enlaces simbólicos sean relativos, puede usar [enlaces simbólicos] (http://www.linuxcommand.org/man_pages/symlinks8.html) de esta manera: 'cp -sR/orig/dest && symlinks - rc/dest' –

0

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

7

También existe la utilidad "lndir" (de X) que hace tal cosa; Lo encontré mencionado aquí: Debian Bug report #301030: can we move lndir to coreutils or debianutils?, y ahora estoy feliz de usarlo.

+2

Tuve el problema exacto como el autor de la pregunta original, y después de comenzar a codificar un script de shell, encontré esta respuesta y descubrí que ya se había instalado lndir. Funciona exactamente como lo necesito. – shmuelp

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

hará lo que quiera. 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 en cuanto a lo que está copiando: si dest_dir ya existe, tendrá que hacer algo como:

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

Si tienes ganas de ensuciarse las manos Aquí es un truco eso creará automáticamente la carpeta de destino, las subcarpetas y el enlace simbólico de todos los archivos recursivamente.

En la carpeta donde los archivos que desea enlazar simbólicamente y subcarpetas son:

  1. crear una cáscara de archivo.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 "[email protected]"; 
do 
    echo "${DESTINATION}${DIR}" 
    mkdir -p "${DESTINATION}${DIR}"   
    done' - 


find . -type f -print0 | xargs -0 bash -c 'for file in "[email protected]"; 
do 
    ln -s "${TARGET}${file}" "${DESTINATION}${file}" 
    done' - 
  1. guardar el archivo ctrl+O
  2. cerrar el archivo ctrl+X
  3. Haga su script ejecutable chmod 777 shell.sh

  4. Ejecutar la secuencia de comandos ./shell.sh

feliz piratería!

Cuestiones relacionadas