¿Qué es el comando Unix para crear un hardlink a un directorio en OS X?


¿Cómo se crea un enlace duro (en lugar de un enlace simbólico o un alias de Mac OS) en OS X que apunta a un directorio? Ya conozco el comando "ln target destination" pero eso solo funciona cuando el destino es un archivo. Sé que Mac OS, a diferencia de otros entornos Unix, permite enlaces duros a carpetas (esto se usa para Time Machine, por ejemplo), pero no se cómo hacerlo yo mismo.

Author: username, 2008-09-17

13 answers

Estoy de acuerdo en que las carpetas/directorios de enlace duro pueden causar problemas si no se tiene cuidado, pero tienen una ventaja muy definida: 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 los discos más grandes.

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

  1. El sistema de archivos debe llevar un registro HFS+.
  2. El los directorios padre del origen y del destino deben ser diferentes.
  3. El padre 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 antepasado que sea un enlace duro de directorio.

Así que no es correcto en absoluto que Snow Leopard ha perdido la capacidad de crear enlaces duros a carpeta.

Acabo de verificar que enlace / desvincular hacer el trabajo en Snow Leopard - siempre y cuando siga los seis regla. Acabo de probarlo 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í está el "hunlink.c " programa:

#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

Por lo tanto, tenga cuidado si lo intenta - recuerde seguir las reglas y utilizar hlink para crear estos enlaces duros y utilizar hunlink para eliminar el enlace duro después. Y no se olvide de documentar lo lo has hecho para más tarde o para alguien más que podría necesitar saber esto.

Otro "gotcha" que acabo de aprender sobre estos "enlaces duros" a carpetas. Cuando los crea, realmente hay muchas cosas que suceden "detrás de la cortina" de Mac OS X. Un problema realmente importante es que la carpeta a la que crea el enlace realmente se mueve a una carpeta súper mágica súper oculta llamada /.HFS + Private Directory Data%000d / dir_xxx donde xxx es el número inode de la "source_folder" - recuerde el el formato del comando es

hlink source_folder target_folder

Así que debido a esto, tienes que tener cuidado de no tener ningún archivo abierto en la "source_folder" porque si lo haces, simplemente se movieron a la carpeta súper mágica y es probable que tengas un problema si intentas guardar cualquier cambio en esos archivos que estaban abiertos en la "source_folder". Esto me pasó un par de veces hasta que me di cuenta de lo que estaba sucediendo y la solución es bastante simple. Noté que no podías hacer una orden de "ls-la" más tiempo sin obtener errores divertidos para todas las carpetas / directorios que estaban en la "source_folder" original, pero podría hacer un comando " ls " y todo se veía bien.

Si ejecuta "Verify disk" en el programa "Disk Utility", notará que probablemente se queja y da un "Volume bitmap needs minor repair for orphaned blocks" que es lo que acaba de suceder con la creación de la carpeta súper mágica y el movimiento de la "source_folder" a ella.

Si te encuentras en esta situación con "bloques huérfanos", primero guarde los archivos modificados en otra ubicación temporal que no esté en el volumen que contiene el árbol" source_folder", luego use" Utilidad de discos "para desmontar y volver a montar el volumen que contiene la" source_folder " o simplemente reinicie el equipo. A continuación, copie los archivos que guardó en las ubicaciones temporales de nuevo a sus ubicaciones originales y debería estar de vuelta en el negocio. Esto es lo que funcionó para mí, así que no puedo garantizar que esto funcione para ti también. Así que podría ser un buena idea para probar esto en un volumen que tiene una buena copia de seguridad de por si acaso.

Parece muy raro que toda esta sobrecarga se produzca solo por la simple tarea de crear un enlace duro a una carpeta. ¿Alguien tiene alguna idea de por qué Mac OS X va a todo este esfuerzo para esta creación de enlaces duros a carpetas? ¿Tiene algo que ver con el hecho de que este es un sistema de archivos "diario"?

Descubrí la información sobre la ubicación súper mágica y súper oculta al leer el libro de Amit Singh explicación de su utilidad "hfsdebug". Si desea más detalles ver su sitio web en Amit Singh 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 descargarlo y probarlo. Ya no es compatible, pero todavía funciona tanto en Snow Leopard y Leopard - básicamente cualquier sistema compatible con HFS+. Realmente no puedes hacer ningún daño con él, ya que es una herramienta de "solo lectura", por lo que es genial usarla para mira algunos detalles del sistema de archivos.

Un problema más sobre estos "enlaces duros a carpetas": una vez que creas una y se crea la carpeta súper mágica súper secreta oculta, está ahí para siempre. Incluso si desvincula la carpeta que causó que se creara en primer lugar, esta carpeta mágica permanece alrededor. No estoy seguro de por qué, pero definitivamente lo hace. Puede utilizar "hfsdebug" para averiguar esto si desea probarlo. También puede utilizar "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 7 79 para una persona en cualquier número de computadoras en el mismo hogar para una licencia personal de tipo no comercial. Tiene una extensa Guía de usuario de 173 páginas que puede descargar para ver lo que puede hacer antes de comprar. Desafortunadamente no hay versión de prueba, así que lee el manual y echa un vistazo a la web sitio para más detalles para ver si puede ayudarle a salir de un atasco. Aprenda todos los detalles al respecto en su sitio web - ver fileXray sitio web para más información.

Hay un par de problemas que debe tener en cuenta al usar estos enlaces duros a carpetas. Si el volumen en el que se crean se monta en un cliente remoto, puede haber problemas significativos, dependiendo de cómo se monten. Si utiliza AFP para montar el volumen en un cliente remoto, hay grandes problemas como cualquier carpeta que actualmente tiene un enlace duro a él o que alguna vez ha tenido uno pero luego se ha eliminado, no se podrá usar ya que todas las carpetas de nivel inferior (pero no los archivos) serán inaccesibles desde el Finder o una ventana de Terminal. Si intenta hacer un simple comando "ls-lR", fallará y le dará mensajes de error" ls: xxx: No such file or directory " para todas las carpetas de nivel inferior. Si usa una ventana del Finder para recorrer el árbol de directorios del volumen remoto, las carpetas que se encuentran en la carpeta que tenía o tiene una el enlace duro a él simplemente desaparecerá sin ningún error cuando haga clic por primera vez en el nombre de la carpeta.

Estos problemas no parecen ocurrir (excepto por el mensaje de error) si usa NFS para montar el cliente remoto (y suponiendo que tuviera un servidor NFS en el sistema que tiene el volumen como un sistema de archivos HFS+ local). Los detalles sobre cómo usar 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 cliente. Puede obtenerlo de 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 hacer los montajes NFS, pero el "Administrador de NFS" hace que sea bastante fácil configurar las cosas y ajustar todas las diferentes configuraciones para ayudar a optimizarlo. Tiene varias otras utilidades de Mac OS X también que tienen un precio muy razonable, una llamada "Monitor de hardware" que le permite monitoree y grafique 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 los sistemas Mac locales y remotos durante períodos prolongados de tiempo (de minutos a días). Definitivamente vale la pena echarle un vistazo si le gustan las utilidades útiles.

Una cosa que sí noté es que las transferencias de archivos NFS eran aproximadamente un 20% más lentas que hacerlas 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 funciona incluso si tengo que pagar un golpe de rendimiento del 20% en comparación con no tener nada que funcione en absoluto.

Apple es consciente de los problemas con los enlaces duros y los sistemas de archivos remotos AFP, y se refieren a él como una "limitación de implentación" del cliente AFP - prefiero llamarlo lo que realmente me parece ser - ¡Un ERROR!!! Solo puedo esperar que la próxima versión de Mac OS X solucione el problema, ya que realmente me gusta tener la capacidad de usar enlaces duros a carpetas cuando tiene sentido.

Estas notas son mis propia opinión personal y no hago ninguna garantía sobre su corrección así que úselos bajo su propio riesgo. Tenga una buena copia de seguridad antes de jugar con estos "enlaces duros a carpetas" en caso de que suceda algo imprevisto. Pero espero que te diviertas si decides mirar un poco más en este aspecto interesante de Mac OS X.

 48
Author: Bob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-12 20:12:26

Entonces no puedes hacerlo directamente en BASH. Obstante... He encontrado un artículo aquí que discute cómo hacerlo indirectamente: http://www.mactech.com/articles/mactech/Vol.23/23.11/ExploringLeopardwithDTrace/index.html compilando un pequeño programa C simple:

#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.aplicación con:

$ gcc -o hlink hlink.c -Wall
 31
Author: username,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-02 10:55:54

Piffle. En 10.5, le dice en la página de manual para ln :

   -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

Dale tu contraseña, y aún no has terminado. No lo documentaste, ¿verdad? Usted debe documentar directorios enlazados; incluso si se trata de una máquina de un solo usuario.

Eliminar es una historia diferente: si lo hace de la manera habitual de eliminar directorios, eliminará el contenido. Así que debe "desvincular" el directorio:

    unlink  new_hard_link

Ahí. Esperar ¡no arruinas tu sistema de archivos!

 14
Author: Rich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-10 19:54:53

Cross-posting esta gran herramienta que resuelve perfectamente el problema, publicado originalmente por Sam:


Para instalar Hardlink, asegúrese de haber instalado homebrew , luego ejecute:

brew install hardlink-osx

Una vez instalado, crear un enlace duro con:

hln [source] [destination]

También me di cuenta de que el comando unlink no funciona en snow leopard, por lo que agregué una opción para desvincular:

hln -u destination

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

 13
Author: Simon East,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:31:37

Sí, está soportado por el núcleo y el sistema de archivos, pero como no está diseñado para uso general, no está expuesto al shell.

Probablemente podría averiguar qué API utiliza Time Machine y envolverlas en una herramienta de línea de comandos, pero sería mejor tomar la pista y mantenerse bien claro.

 9
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-17 08:35:34

La versión OSX de ln no puede hacerlo, pero, como se menciona en la otra respuesta de 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 -dcon 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.

As un prerrequisito, install coreutils:

    brew install coreutils

Ahora puedes hacer:

    sudo gln -d /original_folder /mirror_folder

IMPORTANTE: Para eliminar el enlace duro que debe use gunlink:

    sudo gunlink /mirror_folder

Usando rm o Finder también eliminará la carpeta original.

Para su información: La fórmula de homebrew coreutils proporciona las versiones compatibles con GNU de las herramientas genéricas de unix. Use brew list coreutils para ver la lista completa.

 4
Author: ccpizza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-08 17:26:58

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

Mi solución alternativa para resolver el problema fue 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 usar enlaces duros a los 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/
 2
Author: Jesper Rønn-Jensen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-14 09:00:11

La respuesta corta es que no puedes.:) (excepto posiblemente como root, cuando sería más preciso decir que no debes.)

Los unixes solo permiten un número determinado de enlaces a directorios - ".."dentro de todos sus hijos y "."desde dentro de sí mismo. Cualquier otra cosa es potencialmente una receta para un árbol de directorios muy confuso. Esto es / fue aparentemente una decisión de diseño de Ken Thompson.

(Dicho esto, aparentemente la Máquina del Tiempo de Apple hace esto:))

 1
Author: Penfold,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-17 08:06:14

Desde el 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 lugar.

 1
Author: Gannet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-15 02:08:40

Esto también se puede hacer con Perl integrado (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 vincular su carpeta "Documentos" a Google Drive para que se sincronice:

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

Para eliminar el enlace a su carpeta "Documentos" de Google Drive:

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

Necesita "root" para desvincular (consulte "desvincular" perldoc).

 1
Author: techiejohn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-13 14:28:02

Otra solución es usar bindfs https://code.google.com/p/bindfs / que se puede instalar a través del puerto:

sudo port install bindfs
sudo bindfs ~/source_dir ~/target_dir
 0
Author: Kit Sunde,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-12 21:44:21

En caso de que no haya una subcarpeta, puede probar

Ln folder_path/*. * target_folder

Funcionó para mí en OSX 10.9

 0
Author: Nuray Altin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-16 00:24:21

En Linux puede usar bind mount para simular directorios de enlace duro. No estoy seguro acerca de OSX

sudo mount --bind /some/existing_real_contents /else/dummy_but_existing_directory
sudo umount /else/dummy_but_existing_directory
 0
Author: zainengineer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-11 04:46:45