Создание жестких ссылок каталога в MacOS X?

Как создать жесткую ссылку на каталог в OSX?

Эта функция была добавлена ​​к их файловой системе в 10.5 (для машины времени), но я не смог найти никакой информации о ее фактическом использовании из командной строки.

Ответ 1

К сожалению, Apple испортила команду ln. Вы можете использовать следующую программу для создания жесткой ссылки на каталог:

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

int main(int argc, char* argv[]) {
 if (argc != 3) {
  fprintf(stderr,"Use: hlink <src_dir> <target_dir>\n");
  return 1;
 }
 int ret = link(argv[1],argv[2]);
 if (ret != 0)
  perror("link");
 return ret;
}

Учтите, что жесткие связанные каталоги могут не находиться в одном и том же родительском каталоге, поэтому вы можете сделать это:

$ gcc hlink.c -o hlink
$ mkdir child1
$ mkdir parent
$ ./hlink child1 parent/clone2

Ответ 2

Я связал предложенный ответ в сообщении git, если кому-то интересно: https://github.com/selkhateeb/hardlink

После установки создайте жесткую ссылку:

hln source destination

Я также заметил, что команда unlink не работает на снежном барсе, поэтому я добавил возможность отсоединить:

hln -u destination

Чтобы установить Hardlink, используйте homebrew и запустите:

brew install hardlink-osx

Ответ 3

В ответ на вопрос by_undefined о том, как удалить жесткую ссылку в каталог, не удаляя содержимое других каталогов, с которыми оно связано: насколько я могу судить, это невозможно сделать из командной строки, используя встроенные команды. Однако эта небольшая программа (вдохновленная сообщением Фримана) будет делать это:

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

int main(int argc, char* argv[]) {
 if (argc != 2) {
  fprintf(stderr,"Use: hunlink <dir>\n");
  return 1;
 }
 int ret = unlink(argv[1]);
 if (ret != 0)
  perror("unlink");
 return ret;
}

Чтобы следовать примеру Фримена,

$ gcc hunlink.c -o hunlink
$ echo "foo bar" > child1/baz.txt
$ ./hunlink parent/clone2

Удалит hardlink в parent/clone2, но оставьте директорию child1 и файл child1/baz.txt в одиночку.

Ответ 4

Другим решением является использование bindfs https://code.google.com/p/bindfs/, который устанавливается через порт:

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