it-swarm-es.com

¿Cuál es el comando Unix para crear un enlace duro 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 "En destino de destino", pero eso solo funciona cuando el destino es un archivo. Sé que Mac OS, a diferencia de otros entornos Unix, permite el enlace directo a carpetas (esto se usa para Time Machine, por ejemplo), pero no sé cómo hacerlo yo mismo.

48
username

No puedes hacerlo directamente en BASH entonces. Sin embargo ... Encontré un artículo aquí que analiza cómo hacerlo indirectamente: http://www.mactech.com/articles/mactech/Vol.23/23.11/ExploringLeopardwithDTrace/index.html por compilando un pequeño programa en 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 compilar en Terminal.app con:

$ gcc -o hlink hlink.c -Wall
31
username

Estoy de acuerdo en que las carpetas/directorios vinculados pueden causar problemas si no son cuidadosos, pero tienen una ventaja muy clara: 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 rápidamente incluso el disco más grande.

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

  1. El sistema de archivos se debe registrar como HFS +.
  2. Los directorios principales del origen y el 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 descendiente de la fuente.
  6. El destino no debe tener ningún antepasado que sea un enlace rígido de directorio.

Por lo tanto, no es correcto en absoluto que Snow Leopard haya perdido la capacidad de crear enlaces duros a carpetas.

Acabo de verificar que vincular/desvincular funciona en Snow Leopard, siempre y cuando sigas las seis reglas. 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 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

Por lo tanto, tenga cuidado si lo intenta: recuerde seguir las reglas y use hlink para crear estos enlaces duros y use hunlink para eliminar el enlace duro después. Y no olvide documentar lo que ha hecho para más adelante o para otra persona que pueda necesitar saber esto.

Otro "problema" que acabo de aprender sobre estos "enlaces duros" a las carpetas. Cuando los creas, realmente sucede mucho "detrás de la cortina" de Mac OS X. Una cuestión realmente importante es que la carpeta a la que creas el enlace realmente se mueve a una carpeta súper mágica súper oculta llamada /.HFS+ Datos de directorio privado% 000d/dir_xxx donde xxx es el número de inodo de la "carpeta_origen" - recuerde que el formato del comando es

hlink source_folder target_folder

Por eso, debes tener cuidado de no tener ningún archivo abierto en la "carpeta_origen" porque si lo haces, simplemente se moverán a la carpeta supermágica y es probable que tengas un problema si intentas guardar los cambios a aquellos archivos que estaban abiertos en la "carpeta_origen". Esto me sucedió un par de veces hasta que me di cuenta de lo que estaba sucediendo y la solución es bastante simple. Me di cuenta de que ya no podía hacer un comando "ls -la" sin obtener errores divertidos para todas las carpetas/directorios que estaban en la "carpeta_origen" original, pero podía hacer un comando "ls" y todo se veía bien.

Si ejecuta "Verificar disco" en el programa "Utilidad de discos", notará que probablemente se queja y le da un "Mapa de bits de volumen que necesita una reparación menor para los bloques huérfanos", que es lo que sucedió con la creación de la carpeta supermágica y el movimiento de la "carpeta_origen" hacia ella.

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

Parece tan extraño que toda esta sobrecarga ocurre solo por la simple tarea de crear un enlace duro a una carpeta. ¿Alguien tiene alguna idea de por qué Mac OS X hace todo este esfuerzo para la creación de este enlace duro a las carpetas? ¿Tiene algo que ver con el hecho de que este es un sistema de archivos "registrado"?

Descubrí la información sobre la ubicación súper mágica y súper oculta leyendo la explicación de Amit Singh de su utilidad "hfsdebug". Si desea más detalles, consulte su sitio web en la utilidad hfsdebug de Amit Singh . Es un software muy interesante y le brindará 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 aún funciona en Snow Leopard y Leopard, básicamente en cualquier sistema compatible con HFS +. Realmente no puede causar ningún daño, ya que es una herramienta de "solo lectura", por lo que es excelente para ver algunos detalles del sistema de archivos.

Una cuestión más sobre estos "enlaces duros a carpetas": una vez que crea uno y se crea la carpeta súper mágica súper secreta oculta, está ahí para siempre. Incluso si desvincula la carpeta que hizo que se creara en primer lugar, esta carpeta mágica se mantiene. No estoy seguro de por qué, pero definitivamente lo hace. Puede usar "hfsdebug" para descubrir 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. Lamentablemente, no hay una versión de prueba, así que lea el manual y consulte el sitio web para obtener más detalles para ver si puede ayudarlo a salir del apuro. Conozca todos los detalles al respecto en su sitio web; consulte sitio web fileXray para obtener más información.

Hay un par de problemas que debe tener en cuenta al usar estos enlaces duros a las carpetas. Si el volumen en el que se crean 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, existen grandes problemas, ya que cualquier carpeta que actualmente tenga un enlace rígido o que alguna vez haya tenido una pero que luego se haya eliminado, no podrá usarse como todas las carpetas de nivel inferior ( pero no archivos) será inaccesible desde el Finder o desde una ventana de Terminal. Si intenta hacer un simple comando "ls -lR", fallará y le dará mensajes de error "ls: xxx: No existe dicho archivo o directorio" 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 están en la carpeta que tenía o tiene un enlace duro simplemente desaparecerán sin ningún error cuando haga clic por primera vez en el nombre de la carpeta.

Estos problemas no parecen ocurrir (excepto el mensaje de error) si usa NFS para montar el cliente remoto (y suponiendo que tenía un servidor NFS en el sistema que tiene el volumen como un sistema de archivos HFS + local). Aquí no se proporcionan detalles sobre cómo usar NFS para montar volúmenes. Utilicé un buen programa del Dr. Marcel Bresink llamado "Administrador de NFS" para ayudar con los montajes de NFS en el servidor y el cliente. Puede obtenerlo en su sitio web: solo 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 cómo hacer los montajes NFS, pero el "Administrador NFS" hace que sea bastante fácil configurar y ajustar todas las diferentes configuraciones para ayudar a optimizarlo. También tiene varias otras utilidades para 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 te gustan las utilidades prácticas.

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 para pagar un 20% de rendimiento en comparación con no tener nada que funcione.

Apple es consciente de los problemas con los enlaces duros y los sistemas de archivos AFP remotos, y se refieren a él como una "limitación de implementación" del cliente AFP. Prefiero llamarlo como realmente me parece: ¡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 las carpetas cuando tiene sentido.

Estas notas son mi opinión personal y no garantizo su corrección, así que úselas bajo su propio riesgo. Tenga una buena copia de seguridad antes de jugar con estos "enlaces duros a carpetas" en caso de que ocurra algo imprevisto. Pero espero que te diviertas si decides estudiar un poco más este interesante aspecto de Mac OS X.

49
Bob

Disparate. 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)

Entonces sí:

    Sudo  ln  -d  existing_dir  new_hard_link

Déle su contraseña y aún no ha terminado. No lo documentaste, ¿verdad? Usted debe documentar directorios enlazados; incluso si es una máquina de un solo usuario.

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

    unlink  new_hard_link

Allí. ¡Espero que no arruines tu sistema de archivos!

14
Rich

Publicación cruzada esta gran herramienta que resuelve perfectamente el problema, originalmente publicado por Sam :


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

brew install hardlink-osx

Una vez instalado, cree un enlace duro con:

hln [source] [destination]

También noté que el comando unlink no funciona en Snow Leopard, así 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
Simon East

Sí, es compatible con el kernel y el sistema de archivos, pero como no está destinado para uso general, no está expuesto al Shell.

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

9
Mike F

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 el -d opción 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 ningún lado.

Como requisito previo, instale coreutils:

    brew install coreutils

Ahora puedes hacer:

    Sudo gln -d /original_folder /mirror_folder

[~ # ~] importante [~ # ~] : Para eliminar el enlace duro, usted debe use gunlink:

    Sudo gunlink /mirror_folder

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

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

6
ccpizza

A partir de 2018 ya no es posible. APFS (introducido en MacOS High Sierra 10.13) no es compatible con enlaces de directorio. Ver https://github.com/selkhateeb/hardlink/issues/31

2
ariel

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 CSS y carpetas de imágenes.

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

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

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

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

Los Unix solo permiten un número determinado de enlaces a directorios: ".." desde todos sus elementos secundarios y "." desde dentro de sí 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.

(Habiendo dicho eso, aparentemente Time Machine de Apple hace esto :))

1
Penfold

En Linux, puede usar bind mount para simular directorios de enlaces duros. 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
1
zainengineer

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 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
techiejohn

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

1
Gannet

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
Kit Sunde

en caso de que no haya una subcarpeta, puede intentar

ln folder_path /*.* target_folder

funcionó para mí en OSX 10.9

0
Nuray Altin