2009-09-16 3 views
49

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

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

+2

Это должно быть на суперпользователя, если вы заинтересованы в том, чтобы доступ к этой функции в качестве пользователя из командной строки. Если вы хотите сделать это программно, это будет другая история :-) – Joey

ответ

64

К сожалению, 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 
+3

Эй, я использую это какое-то время - спасибо тонну. Тем не менее, я заметил, что если я удалю жесткий каталог (rm -rf), он также уничтожит содержимое исходного исходного каталога. Имеет смысл, поскольку rm -rf проходит через каталог и удаляет файл по файлу. Тем не менее, я хотел бы иметь возможность удалить жесткую ссылку напрямую. Это возможно? –

+3

Вы пробовали команду unlink и системный вызов? – Freeman

+1

+1 (давал бы больше, если бы мог) Это полностью спасло мой бекон! –

17

В ответ на вопрос 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 

будет удалить жесткую связь на родительском/clone2, но оставить ребенка1 каталог и файл child1/baz.txt.

73

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

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

hln source destination 

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

hln -u destination 

Для установки HardLink используйте homebrew и запуск:

brew install hardlink-osx 
+2

Спасибо. Работал для меня. Но вы должны добавить комментарий Jean-Philippe Pellet do README. –

+0

@Sam: Я на 10.6.8. Связывание работает, но отключение - нет. :( Любые предложения? –

+4

Стоит отметить, что это теперь на [Homebrew] (https://github.com/Homebrew/homebrew/blob/master/Library/Formula/hardlink-osx.rb). install hardlink-osx' –

5

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

sudo port install bindfs 
sudo bindfs ~/source_dir ~/target_dir 
Смежные вопросы