Создание каталогов жестких ссылок в Mac OS X
Как создать жесткую ссылку на каталог в Mac OS X?
Эта функция была добавлена в их файловую систему в Mac OS X v10.5 (Leopard) (для машины времени), но я не смог найти никакой информации о фактическом ее использовании из командной строки.
4 ответа
К сожалению, 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
Я собрал предложенный ответ в репозитории Git, если кому-то интересно: https://github.com/selkhateeb/hardlink
После установки создайте жесткую ссылку с:
hln source destination
Я также заметил, что unlink
Команда не работает на Mac OS X v10.6 (Snow Leopard), поэтому я добавил опцию, чтобы отменить связь:
hln -u destination
Чтобы установить Hardlink, используйте Homebrew и запустите:
brew install hardlink-osx
В ответе на вопрос the_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
удалит жесткую ссылку в parent/clone2, но покинет каталог child1
и файл child1/baz.txt
в одиночестве.
Другое решение - использовать https://code.google.com/p/bindfs/ bindfs, который можно установить через порт:
sudo port install bindfs
sudo bindfs ~/source_dir ~/target_dir