2008-09-17 15 views
45

¿Cómo se crea un enlace físico (a diferencia de un enlace simbólico o un alias de Mac OS) en OS X que apunta a un directorio? Ya conozco el comando "En el destino de destino", pero eso solo funciona cuando el objetivo es un archivo. Sé que el sistema operativo Mac, a diferencia de otros entornos Unix, permite enlaces rígidos a las carpetas (esto se utiliza para Time Machine, por ejemplo), pero no sé cómo hacerlo yo mismo.¿Cuál es el comando de Unix para crear un enlace fijo a un directorio en OS X?

+3

Sweet ... hlink ahora vive en/usr/local/bin :) –

+0

Gracias Mike F, ese fue un consejo útil. – Nic

+0

Información: en iPhone 3G fw 3.1.2 jailbroken enlaces duros a directorios no están permitidos también si está registrado como "raíz". –

Respuesta

31

No puede hacerlo directamente en BASH a continuación. Sin embargo ... He encontrado un artículo que discute aquí cómo hacerlo indirectamente: http://www.mactech.com/articles/mactech/Vol.23/23.11/ExploringLeopardwithDTrace/index.html compilando un simple y pequeño programa en C:

#include <unistd.h> 
#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    if (argc != 3) return 1; 

    int ret = link(argv[1], argv[2]); 

    if (ret != 0) perror("link"); 

    return ret; 
} 

... y construir en Terminal.app con:

$ gcc -o hlink hlink.c -Wall 
+10

NOTA: necesita ** hunlink ** para eliminar ese directorio sin mover su contenido -> http://stackoverflow.com/questions/1432540/creating-directory-hard- links-in-macos-x/2440126 # 2440126 –

+1

¿Alguien sabe cómo trata timemachine los enlaces duros que existen en un volumen que se respalda? – 0cd

1

La respuesta corta es que no puede. :) (excepto posiblemente como raíz, cuando sería más exacto decir que no debería).

Unixes solo permiten un número determinado de enlaces a directorios - ".." desde todos sus elementos secundarios y "." desde dentro de si mismo Cualquier otra cosa es potencialmente una receta para un árbol de directorios muy confuso. Esta es/fue aparentemente una decisión de diseño de Ken Thompson.

(Dicho esto, al parecer, Time Machine de Apple hace esto :))

9

sí, es soportado por el núcleo y el sistema de archivos, pero ya que no está destinado para el uso general que no es expuesto a la cáscara.

Probablemente pueda averiguar qué API utiliza Time Machine y envolverlas en una herramienta de línea de comandos, pero sería mejor tomar la pista y la dirección bien claras.

+2

la página de manual para el enlace (2) dice lo contrario ... – Alnitak

2

Mi caso fue que descubrí que, desde una máquina virtual de Windows, no puedo seguir los enlaces simbólicos. (quería probar algunas páginas HTML en Internet Explorer). Y mi estructura de directorios tenía enlaces simbólicos para CSS y carpetas de imágenes.

Mi solución para resolver el problema era un enfoque diferente al de las otras respuestas implícitas. Usé rsync para crear una copia de la carpeta. Rsync puede resolver los enlaces simbólicos y copiar los archivos vinculados en lugar.

Esto resolvió mi problema sin utilizar enlaces duros a directorios. Y en realidad es una solución fácil si solo estás trabajando en un pequeño conjunto de archivos.

rsync -av --copy-dirlinks --delete ../htmlguide ~/src/ 
14

Piffle. En 10.5, le indica en la página del manual de En:

-d, -F, --directory 
      allow the superuser to attempt to hard link directories (note: 
      will probably fail due to system restrictions, even for the 
      superuser) 

Así que sí:

sudo ln -d existing_dir new_hard_link 

darle su contraseña y que no hemos terminado. Usted no lo documentó, ¿verdad? Usted debe documentar directorios con enlaces duros; incluso si es una máquina de un solo usuario.

Eliminar es una historia diferente: si lo haces de la manera habitual para eliminar directorios, eliminarás los contenidos.Por lo que debe "desvincular" el directorio:

unlink new_hard_link 

Hay. ¡Espero que no arruines tu sistema de archivos!

+8

¿Estás seguro de que no estás mirando GNU ln o algo así? Comprobé en Snow Leopard y luego revisé la página de manual en mi partición de Leopard, y ambas no tienen -d y definen -F como algo más. Aquí está la versión web: http://developer.apple.com/mac/library/documentation/Darwin/Reference/ManPages/man1/ln.1.html –

+3

ln: opción ilegal - d (10.7.3) –

+6

Lo sé esto tiene más de dos años, pero lo encontré muy útil. Requiere la versión de GNU de ln como se menciona por @Peter Hosey. La utilidad ln forma parte de GNU Coreutils y se puede instalar fácilmente a través de homebrew: brew install coreutils. – bradym

1

Del artículo vinculado a, obtendrá ese error si intenta crear el enlace duro en el mismo directorio que el original. Tienes que crearlo en otro lado.

48

Estoy de acuerdo en que las carpetas/directorios de enlace duro pueden causar problemas si no se tienen cuidado, pero tienen una ventaja muy definitiva: Time Machine es un ejemplo perfecto. Sin ellos, simplemente no sería práctico ya que la duplicación de versiones redundantes de archivos consumiría muy rápidamente incluso el disco más grande.

Snow Leopard puede crear enlaces duros a directorios, siempre y cuando siga seis reglas de Amit Singh:

  1. El sistema de archivos debe ser HFS +.
  2. Los directorios principales de la fuente y el destino deben ser diferentes.
  3. El origen de la fuente no debe ser el directorio raíz.
  4. El destino no debe estar en el directorio raíz.
  5. El destino no debe ser un descendiente de la fuente.
  6. El destino no debe tener ningún ancestro que sea un enlace fijo de directorio.

Así que no es correcto que Snow Leopard haya perdido la capacidad de crear enlaces duros a las carpetas .

Acabo de verificar que el enlace/desvinculación funciona en Snow Leopard, siempre y cuando siga las seis reglas . Lo probé y funciona bien en mi sistema Snow Leopard 10.6.6. Lo probé en el volumen de arranque y en un volumen externo USB separado y funcionó bien en ambos casos.

Aquí es el programa "hunlink.c":

#include <stdio.h> 
#include <unistd.h> 
int 
main(int argc, char *argv[]) 
{ 
    if (argc != 2) 
     return 1; 
    int ret = unlink(argv[1]); 
    if (ret != 0) 
     perror("unlink"); 
    return ret; 
} 

gcc -o hunlink hunlink.c 

tanto, tenga cuidado si lo intentas - Recuerde seguir las reglas y utilizar HLINK para crear estos enlaces duros y utilizar hunlink a quitar el disco enlace después Y no se olvide de documentar lo que ha hecho para más adelante o para otra persona que pueda necesitar saber esto.

Otro "gotcha" que acabo de aprender sobre estos "enlaces duros" a las carpetas. Cuando los creas, hay mucho que sucede "detrás de la cortina" de Mac OS X. Un problema realmente importante es que la carpeta a la que creas el enlace se mueve realmente a una carpeta súper oculta súper mágica llamada /.HFS+ Directorio de datos privados% 000d/dir_xxx donde xxx es el número de inodo del "source_folder" - recuerda el formato del comando es

hlink source_folder target_folder 

Así que debido a esto, usted tiene que tener cuidado de no tener todos los archivos abiertos en la "carpeta_fuente" porque si lo haces, simplemente se movieron a la carpeta supermágica y es probable que tengas un problema si intentas guardar cualquier cambio en los archivos que estaban abiertos en la "carpeta_fuente". Esto me pasó un par de veces hasta que caí en la cuenta de lo que estaba sucediendo y la solución es bastante simple. Noté que no podías hacer un comando "ls -la" por más tiempo sin obtener errores graciosos para todas las carpetas/directorios que estaban en la "carpeta_origen original", pero podías hacer un comando "ls" y todos se veían bien.

Si ejecuta "Verificar disco" en el programa "Utilidad de disco", notará que probablemente se queja y le da un "Mapa de bits de volumen necesita reparación menor para bloques huérfanos", que es lo que acaba de ocurrir con la creación de la super -magic carpeta y el movimiento de la "fuente-carpeta" a la misma.

Si se encuentra en esta situación con "bloques huérfanos", primero guarde los archivos cambiados en alguna otra ubicación temporal que no esté en el volumen que contiene el árbol "source_folder", luego use "Disk Utility" para desmontar y volver a montar volumen que contiene la "carpeta_origen" o simplemente reinicie la computadora. Luego, copie los archivos que guardó en las ubicaciones temporales de nuevo en sus ubicaciones originales y debe volver a estar en el negocio. Esto es lo que funcionó para mí, por lo que no puedo garantizar que esto también funcione para usted. Así que podría ser una buena idea probar esto en un volumen que tenga una buena copia de seguridad por si acaso.

Parece tan extraño que toda esta sobrecarga ocurra solo por la simple tarea de crear un enlace fijo a una carpeta. ¿Alguien tiene alguna idea de por qué Mac OS X hace todo este esfuerzo para crear este enlace rígido en las carpetas? ¿Tiene algo que ver con el hecho de que este es un sistema de archivos "diario"?

Descubrí la información acerca de la ubicación supermágica y supercubierta leyendo la explicación de Amit Singh de su utilidad "hfsdebug". Si desea más información, consulte su sitio web al Amit Singh's hfsdebug utility. Es una pieza de software muy interesante y le dirá muchos detalles sobre los sistemas de archivos HFS +. Es gratis y te animo a que lo descargues y lo pruebes. Ya no es compatible, pero funciona tanto en Snow Leopard como en Leopard, básicamente cualquier sistema compatible con HFS +. No se puede hacer ningún daño con él, ya que es una herramienta de "solo lectura", por lo que es genial usarlo para ver algunos detalles del sistema de archivos.

Un problema más con estos "enlaces duros a las carpetas": una vez que se crea uno y se crea la carpeta súper secreta oculta súper mágica, está ahí para siempre. Incluso si desenlaza la carpeta que provocó que se cree en primer lugar, esta carpeta mágica se queda. No estoy seguro por qué, pero definitivamente sí. Puede usar "hfsdebug" para averiguar esto si desea probarlo. También puede usar "hfsdebug" para averiguar cuántos de estos "enlaces duros a carpetas" existen en una unidad. Para estos detalles, consulte el artículo de Amit sobre la utilidad "hfsdebug".

También tiene otra utilidad más nueva que es compatible, pero cuesta. Se llama fileXray y cuesta $ 79 para una persona en cualquier cantidad de computadoras en el mismo hogar para una licencia personal de tipo no comercial. Tiene una extensa Guía del usuario de 173 páginas que puede descargar para ver qué puede hacer antes de comprar. Desafortunadamente no hay una versión de prueba, así que lea el manual y revise el sitio web para obtener más detalles para ver si puede ayudarlo a salir de un aprieto. Conozca todos los detalles al respecto en su sitio web - vea fileXray web site para más información.

Hay un par de cuestiones que debe tener en cuenta al utilizar estos enlaces duros a las carpetas. Si el volumen en el que se crearon está montado en un cliente remoto, puede haber problemas importantes, dependiendo de cómo estén montados. Si usa AFP para montar el volumen en un cliente remoto, hay grandes problemas ya que cualquier carpeta que actualmente tenga un enlace rígido o que alguna vez haya tenido una pero que luego se elimine, no podrá ser utilizada como todas las carpetas de nivel inferior (pero no archivos) serán inaccesibles desde el Finder o una ventana de Terminal. Si intenta hacer un simple comando "ls -lR", fallará y le dará los mensajes de error "ls: xxx: No existe tal archivo o directorio" para todas las carpetas de nivel inferior. Si utiliza una ventana del Buscador para recorrer el árbol de directorios del volumen remoto, las carpetas que están en la carpeta que tenía o tiene un enlace fijo simplemente desaparecerán sin ningún error cuando haga clic por primera vez en el nombre de la carpeta.

Parece que estos problemas no aparecen (excepto el mensaje de error) si usa NFS para montar el cliente remoto (y suponiendo que tiene un servidor NFS en el sistema que tiene el volumen como un sistema de archivos local HFS +).Los detalles sobre cómo utilizar NFS para montar volúmenes no se proporcionan aquí. Usé un buen programa del Dr. Marcel Bresink llamado "NFS Manager" para ayudar con los montajes NFS en el servidor y el cliente. Puede obtenerlo desde su sitio web: simplemente busque "Bresink NFS Manager" en su motor de búsqueda favorito, pero tiene una versión de prueba gratuita para que pueda probar antes de comprar. No es tan importante si quieres aprender a montar NFS, pero el "Administrador de NFS" hace que sea más fácil configurar las cosas y ajustar todas las configuraciones para ayudar a optimizarlo. También tiene otras utilidades ordenadas de Mac OS X que tienen un precio muy razonable: una llamada "Monitor de Hardware" que le permite monitorear y graficar todo tipo de cosas como el uso de energía, la temperatura de la CPU, la velocidad de los ventiladores y muchas otras variables para ambos los sistemas Mac locales y remotos durante largos períodos de tiempo (de minutos a días). Definitivamente vale la pena echarle un vistazo si está en útiles utilidades.

Una cosa que noté es que las transferencias de archivos NFS fueron aproximadamente un 20% más lentas que hacerlo a través de AFP, pero su "kilometraje puede variar", por lo que no hay garantías de una manera u otra, pero preferiría tener algo que funcione incluso si tengo que pagar un golpe de rendimiento del 20% en comparación con no tener nada de trabajo en absoluto.

Apple es consciente de los problemas con los enlaces duros y los sistemas remotos de archivos AFP, y se refieren a esto como una "limitación de implementación" del cliente AFP. Prefiero llamarlo como realmente me parece: un ERROR !!! Solo espero que el próximo lanzamiento de Mac OS X resuelva el problema, ya que realmente me gusta tener la capacidad de usar enlaces duros a las carpetas cuando tenga sentido.

Estas notas son mi opinión personal y no hago ninguna garantía sobre su corrección, así que úsalas bajo tu propio riesgo. Haga una buena copia de seguridad antes de jugar con estos "enlaces duros a las carpetas" en caso de que ocurra algo imprevisto. Pero yo espero que se diviertan si decide buscar un poco más en este aspecto interesante de Mac OS X.

+16

omg muro de texto –

+2

Violé la regla n. ° 2 Creo que, enlacé '/ nix/store' con'/nix/var/pure/nix/store' y funcionó, pero después de reiniciar, el directorio '/ nix/store' estaba vacio. No puedo estar seguro si fue por los enlaces duros, pero la marca de tiempo coincide con el reinicio y estoy seguro de que no hice 'rm -rf/nix/store/*'. * No use enlaces duros de directorio *. – w00t

+0

Todavía tengo curiosidad por saber qué sucede si creo un enlace fijo (así que ahora tengo dos enlaces duros que apuntan a lo mismo) y luego elimino (usando Finder) el directorio principal de uno de ellos. ¿Hace algún tipo de recuento de referencias internamente o simplemente eliminará el directorio subyacente real y, por lo tanto, invalidará los enlaces restantes? – Grishka

1

Otra solución es utilizar bindfs https://code.google.com/p/bindfs/ que es instalable a través del puerto:

sudo port install bindfs 
sudo bindfs ~/source_dir ~/target_dir 
+0

Lo hice y funcionó, sin embargo, parece que no puedo eliminar el enlace ahora? ¿Algunas ideas? He estado buscando el código fuente para tratar de resolverlo, pero ha pasado mucho tiempo desde que miré a C, y nunca en el mundo de * nix. Encontré el método unlink(), pero no parece que se llame. También miré a los args que pasaban y tampoco veo ningún indicio allí. No estoy seguro. Cualquier ayuda sería apreciada .. – wasatchwizard

+0

Como un lado no, ejecuté [una utilidad diferente] (http://stackoverflow.com/a/5118678/139793) y funciona tanto para la creación como para la eliminación. Pero, no eliminará el creado por bindfs. Llamé a 'bindfs ~/Documents ~/OneDrive/Documents' (en OSX); tratando de agregarlo a mi OneDrive ... Tal vez fue una mala idea ...: \ – wasatchwizard

0

en el caso no hay subcarpeta, puede probar

ln carpeta_ruta/* .* target_folder

que trabajó para mí en OSX 10.9

+0

... pero supongo que esto está creando múltiples enlaces simbólicos en una 'carpeta_destino' recién creada. – Arjan

+0

sí, usted tiene razón, pero en mi caso fue algo beneficioso. es decir, eliminar un subdirectorio vinculado sin afectar a otros enlaces. –

0

En Linux se puede utilizar para simular unen montar dura que une directorios.No estoy seguro sobre OSX

sudo mount --bind /some/existing_real_contents /else/dummy_but_existing_directory 
sudo umount /else/dummy_but_existing_directory 
12

-Cruz publicar this great tool que resuelve perfectamente el problema, originalmente publicado por Sam:


Para instalar vínculo físico a asegurar que haya instalado homebrew, a continuación, ejecute:

brew install hardlink-osx 

Una vez instalado, cree un enlace rígido con:

hln [source] [destination] 

También he notado que unlink comando no funciona en leopardo de nieve, por lo que añade una opción para desvincular:

hln -u destination 

Código está disponible en Github para aquellos que estén interesados: https://github.com/selkhateeb/hardlink

+0

esto funcionó para mí en OSX –

+0

Gran sugerencia. Simple y fácil. –

1

Esto también se puede hacer con Perl incorporado (desde Terminal) sin compilar nada. Mi caso de uso específico es para Google Drive (que no admite enlaces simbólicos), por lo que los ejemplos a continuación reflejan el caso de uso.

Para enlazar la carpeta de "Documentos" a Google Drive por lo que se sincronizará:

perl -e 'link "/Users/me/Documents", "/Users/me/Google Drive/Documents"' 

para eliminar el enlace a sus "documentos" de Google Drive:

sudo perl -U -e 'unlink "/Users/me/Google Drive/Documents"' 

Es necesario "root "para desvincular (ver" desvincular "perldoc).

2

La versión OSX de ln no puede hacerlo, pero, como se mencionó en la otra respuesta por rich, es posible con la versión GNU de ln que está disponible en homebrew como gln como parte de la fórmula coreutils. man gln enumera la opción -d con la advertencia específica de OSX proporcionada en la respuesta de rich. En otras palabras, no funciona en todos los casos. Lo que determina exactamente si funciona o no no parece estar documentado en ninguna parte.

Como requisito previo, instale coreutils:

brew install coreutils 

Ahora usted puede hacer:

sudo gln -d /original_folder /mirror_folder 

IMPORTANTE: Para quitar el disco enlace que necesidad uso gunlink:

sudo gunlink /mirror_folder 

El uso de rm o Finder también eliminará la carpeta original.

FYI: La fórmula homebrew coreutils proporciona las versiones compatibles con GNU de las herramientas genéricas de Unix. Use brew list coreutils para ver la lista completa.

Cuestiones relacionadas