views:

2647

answers:

9

How do you create a hardlink (as opposed to a symlink or a Mac OS alias) in OS X that points to a directory? I already know the command "ln target destination" but that only works when the target is a file. I know that Mac OS, unlike other Unix environments, does allow hardlinking to folders (this is used for Time Machine, for example) but I don't know how to do it myself.

+2  A: 

The short answer is you can't. :) (except possibly as root, when it would be more accurate to say you shouldn't.)

Unixes only allow a set number of links to directories - ".." from within all its children and "." from within itself. Anything else is potentially a recipe for a very confused directory tree. This is/was apparently a design decision by Ken Thompson.

(Having said that, apparently Apple's Time Machine does do this :) )

Penfold
+6  A: 

Yes it's supported by the kernel and the filesystem, but since it's not intended for general usage it's not exposed to the shell.

You could probably work out which APIs Time Machine uses and wrap them in a commandline tool, but it'd be better to take the hint and steer well-clear.

the man page for link(2) says otherwise...
Alnitak
+2  A: 

The trouble with hard-linking directories is the very real danger of recursing through a directory structure, and never finding the end of it. Soft links to directories are significantly safer. My university professors spent quite a while explaining why infinite loops were bad, so I avoid hard links.

Jonathan
+9  A: 

You can't do it directly in BASH then. However... I found an article here that discusses how to do it indirectly: http://www.mactech.com/articles/mactech/Vol.23/23.11/ExploringLeopardwithDTrace/index.html by compiling a simple little program:

#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;
}

$ gcc -o hlink hlink.c -Wall
username
A: 

My case was that I found out that from a windows virtual machine, I cannot follow symlinks. (i wanted to test some HTML pages in Internet Explorer). And my directory structure had symlinks for CSS and images folders.

My workaround to solve the problem was a different approach than the other answers implied. I used rsync to create a copy of the folder. Rsync can resolve the symlinks and copy the linked files in stead.

This solved my problem without using hard links to directories. And it's actually an easy solution if you're just working on a small set of files.

rsync -av --copy-dirlinks --delete ../htmlguide ~/src/
Jesper Rønn-Jensen
+2  A: 

Piffle. On 10.5, it tells you in the man page for 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)

So yes:

    sudo  ln  -d  existing_dir  new_hard_link

Give it your password, and you're not done yet. You didn't document it, did you? You must document hard linked directories; even if it's a single user machine.

Deleting is a different story: if you go about it the usual way to delete directories, you'll delete the contents. So you must "unlink" the directory:

    unlink  new_hard_link

There. Hope you don't wreck your filesystem!

Rich
Are you sure you're not looking at GNU ln or something? I checked on Snow Leopard and then checked the manpage on my Leopard partition, and both do not have -d and define -F as something else. Here's the web version: http://developer.apple.com/mac/library/documentation/Darwin/Reference/ManPages/man1/ln.1.html
Peter Hosey
A: 

Info: on iPhone 3G fw 3.1.2 jailbroken hard links to directories are not permitted also if you are logged as "root".

helyair
A: 

This solution no longer works as of 10.6 (Snow Leopard). The system returns an error when the code above is run:

link: Operation not permitted
magu
A: 

From the article linked to, you'll get that error if you try to create the hard link in the same directory as the original. You have to create it somewhere else.

Andrew