Что такое команда Unix для создания жесткой ссылки на каталог в OS X?

Как создать жесткую ссылку (в отличие от символической ссылки или псевдонима Mac OS) в OS X, которая указывает на каталог? Я уже знаю команду "LN target destination", но это работает только тогда, когда целью является файл. Я знаю, что Mac OS, в отличие от других сред Unix, позволяет жестко связываться с папками (например, это используется для Time Machine), но я не знаю, как это сделать сам.

13 ответов


Я согласен, что жесткие ссылки на папки/каталоги могут вызвать проблемы, если не быть осторожными, но у них есть очень определенное преимущество-Time Machine - прекрасный пример. Без них это просто не было бы практично, так как дублирование избыточных версий файлов очень быстро потребляло бы даже самый большой из дисков.

Snow Leopard может создавать жесткие ссылки на каталоги, если вы будете следовать шести правилам Амита Сингха:

  1. файловая система должна быть записана в журнал HFS+.
  2. родительской директории источника и назначения должны быть разными.
  3. родителем источника не должен быть корневой каталог.
  4. назначение не должно находиться в корневом каталоге.
  5. пункт назначения не должен быть потомком источника.
  6. у назначения не должно быть предка, который является жесткой ссылкой каталога.

Так что это не правильно, что Снежный Барс потерял способность создавать жесткий ссылки на папки.

Я только что проверил, что link / unlink работают на Snow Leopard - до тех пор, пока вы следуете шести правила. Я просто попробовал, и он отлично работает на моей системе Snow Leopard 10.6.6-попробовал его на загрузочном Томе и на отдельном внешнем томе USB, и он отлично работал в обоих случаях.

вот "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

Итак, будьте осторожны, если вы попробуете - не забудьте следовать правилам и использовать hlink для создания этих жестких ссылок и использовать hunlink для после этого удалите жесткую ссылку. И не забудьте документировать то, что вы сделали позже или для кого-то еще, кому это может понадобиться.

еще один "попался", что я только что узнал об этих" жестких ссылках " на папки. Когда вы их создаете, действительно много чего происходит "за занавесом" Mac OS X. Одна действительно важная проблема заключается в том, что папка, на которую вы создаете ссылку, действительно перемещается в супер-магическую супер-скрытую папку под названием /.HFS+ данные частного каталога%000d/dir_xxx где xxx - номер индекса "source_folder" - помните, что формат команды

hlink source_folder target_folder

поэтому из-за этого вы должны быть осторожны, чтобы не открывать файлы в "source_folder", потому что если вы это сделаете, они просто переместились в супер-магическую папку, и у вас, вероятно, возникнут проблемы, если вы попытаетесь сохранить любые изменения в тех файлах, которые были открыты в "source_folder". Это случалось со мной пару раз, пока до меня не дошло, что происходит, и решение довольно простое. Я заметил, что вы больше не можете выполнять команду "ls-la", не получая смешных ошибок для всех папок/каталогов, которые были в исходной "папке source_folder", но вы могли бы выполнить команду "ls", и все выглядело хорошо.

Если вы запустите "проверить диск" в программе "Дисковая утилита", вы заметите, что он, вероятно, жалуется и дает "растровое изображение Тома нуждается в незначительном ремонте для осиротевших блоков", что только что произошло с созданием супер-магического папка и движение "source_folder" к ней.

Если вы окажетесь в этой ситуации с "осиротевшими блоками", сначала сохраните измененные файлы в другом временном месте, а не в томе, содержащем дерево" source_folder", затем используйте" Disk Utility", чтобы размонтировать и переустановить том, содержащий" source_folder", или просто перезагрузите компьютер. Затем скопируйте файлы, сохраненные во временных расположениях, обратно в исходные расположения, и вы должны вернуться в бизнес. Это то, что сработало для меня, поэтому не могу гарантировать, что это сработает и для вас. Поэтому было бы неплохо попробовать это на томе, у которого есть хорошая резервная копия на всякий случай.

Кажется очень странным, что все эти накладные расходы возникают только для простой задачи создания жесткой ссылки на папку. Кто-нибудь знает, почему Mac OS X идет на все эти усилия для создания этой жесткой ссылки на папки? Имеет ли это какое-то отношение к тому, что это "журнальный" файл система?

я обнаружил информацию о супер-магическом, супер-скрытом месте, прочитав объяснение Амита Сингха его утилиты "hfsdebug". Если вы хотите получить более подробную информацию, см. Его веб-сайт по адресу утилита Hfsdebug Амита Сингха. Это очень интересная часть программного обеспечения и расскажет вам много подробностей о файловых системах HFS+. Это бесплатно, и я призываю вас загрузить его и попробовать. Он больше не поддерживается, но он по-прежнему работает как на Snow Leopard, так и на Leopard - в основном любая поддерживаемая система HFS+. Вы не можете причинить никакого вреда, так как это инструмент" только для чтения", поэтому он отлично подходит для просмотра некоторых деталей файловой системы.

еще один вопрос об этих "жестких ссылках на папки" -как только вы создадите одну и супер-магическую супер-секретную скрытую папку, она будет создана навсегда. Даже если вы разблокируете папку, из-за которой она была создана, эта волшебная папка останется. Не знаю почему, но определенно. Вы можете используйте "hfsdebug", чтобы узнать это, если вы хотите попробовать. Вы также можете использовать "hfsdebug", чтобы узнать, сколько из этих "жестких ссылок на папки" существует на диске. Эти сведения см. В статье Амита об утилите "hfsdebug".

у него также есть еще одна новая утилита, которая поддерживается, но стоит. Это называется fileXray и стоит $ 79 для одного человека на любом количестве компьютеров в том же доме для личной лицензии не-бизнес типа. У него есть обширная инструкция 173-page, которую вы можно скачать, чтобы увидеть, что он может сделать, прежде чем купить. К сожалению, пробной версии нет, поэтому прочитайте руководство и ознакомьтесь с веб-сайтом для получения более подробной информации, чтобы узнать, может ли он помочь вам выйти из затруднения. Узнайте все подробности об этом на своем веб-сайте-см. веб-сайт fileXray для получения дополнительной информации.

есть несколько вопросов, которые вы должны знать при использовании этих жестких ссылок на каталоги. Если том, на котором они созданы, монтируется на удаленный клиент, может быть значительные проблемы, в зависимости от того, как они смонтированы. Если вы используете AFP для подключения Тома к удаленному клиенту, возникают большие проблемы, так как любая папка, которая в настоящее время имеет жесткую ссылку на нее или когда-либо была удалена, не сможет использоваться, поскольку все папки нижнего уровня (но не файлы) будут недоступны ни из Finder, ни из окна терминала. Если вы попытаетесь выполнить простую команду "ls-lR", она потерпит неудачу и выдаст вам" ls: xxx: нет такого файла или каталога " сообщения об ошибках для всех папки нижнего уровня. Если вы используете окно Finder для обхода дерева каталогов удаленного Тома, папки, которые находятся в папке, которая имела или имеет жесткую ссылку на нее, просто исчезнут без каких-либо ошибок при первом нажатии на имя папки.

эти проблемы не возникают (за исключением сообщения об ошибке), если вы используете NFS для подключения удаленного клиента (и предполагая, что у вас есть сервер NFS в системе, которая имеет том как локальную файловую систему HFS+). Подробнее о том, как использовать NFS для монтирования томов здесь не предоставляются. Я использовал хорошую программу от доктора Марселя Бресинка под названием "NFS Manager", чтобы помочь с монтированием NFS на сервере и клиенте. Вы можете получить его со своего веб-сайта-Просто найдите "Bresink NFS Manager" в своей любимой поисковой системе, но у него есть бесплатная пробная версия, поэтому вы можете попробовать, прежде чем покупать. Это не так уж важно, если вы хотите узнать, как делать монтирования NFS, но "менеджер NFS" позволяет довольно легко настроить и настроить все разные настройки для его оптимизации. У него также есть несколько других аккуратных утилит Mac OS X, которые очень разумно оценены - один называется "аппаратный монитор", который позволяет отслеживать и график всех видов вещей, таких как использование энергии, температура процессора, скорость вентиляторов и многие другие переменные для локальных и удаленных систем Mac в течение длительного периода времени (от минут до дней). Определенно стоит проверить, если вы находитесь в handy utilities.

одна вещь, которую я заметил, это файл NFS переводы были примерно на 20% медленнее, чем делать их через AFP, но ваш "пробег может варьироваться", так что никаких гарантий, так или иначе, но я предпочел бы что-то, что работает, даже если мне придется заплатить 20% производительности по сравнению с ничего не работает вообще.

Apple знает о проблемах с жесткими ссылками и удаленными файловыми системами AFP, и они относятся к нему как к "ограничению имплантирования" клиента AFP - Я предпочитаю называть его тем, чем он действительно кажется мне - ошибкой!!! Я могу только надеюсь, что следующий выпуск Mac OS X исправит проблему, так как мне очень нравится иметь возможность использовать жесткие ссылки на папки, когда это имеет смысл.

эти заметки-мое личное мнение, и я не даю никаких гарантий их правильности, поэтому используйте их на свой страх и риск. Имейте хорошую резервную копию, прежде чем играть с этими "жесткими ссылками на папки" на случай, если произойдет что-то непредвиденное. Но я надеюсь, что вам будет весело, если вы решите посмотреть немного больше в этот интересный аспект Mac OS Х.


вы не можете сделать это непосредственно в BASH. Однако... Я нашел здесь статью, в которой обсуждается, как это сделать косвенно: http://www.mactech.com/articles/mactech/Vol.23/23.11/ExploringLeopardwithDTrace/index.html путем компиляции простой маленькой программы C:

#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

невоспитанности. На 10.5 он сообщает вам на странице man для 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)

Да:

    sudo  ln  -d  existing_dir  new_hard_link

дать ему свой пароль, и вы еще не закончили. Вы не задокументировали это, не так ли? Вы должны документировать жестко связанные каталоги; даже если это однопользовательская машина.

удаление-это другая история: если вы идете об этом обычным способом удаления каталогов, вы удалите содержимое. Так ты должны "отвязать" каталог:

    unlink  new_hard_link

там. Надеюсь, вы не разрушите свою файловую систему!


кросс-постинг это отличный инструмент который аккуратно решает проблему, первоначально опубликованную Сэм:


чтобы установить Hardlink, убедитесь, что вы установили доморощенного, затем запустите:

brew install hardlink-osx

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

hln [source] [destination]

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

hln -u destination

код доступен на Github для тех, кто заинтересован:https://github.com/selkhateeb/hardlink


Да, он поддерживается ядром и файловой системой, но поскольку он не предназначен для общего использования, он не подвергается воздействию оболочки.

вы, вероятно, могли бы решить, какие API использует Time Machine, и обернуть их в инструмент командной строки, но было бы лучше понять намек и держаться подальше.


версия OSX ln не может этого сделать, но, как упоминалось в другой ответ богатое, это возможно с версией GNU ln который находится в доморощенного as gln в рамках coreutils формула. man gln перечислены -d опция с OSX-конкретным предупреждением, приведенным в богатое'ы ответ. Другими словами, она работает не во всех случаях. Что именно определяет, работает это или нет, не кажется быть документированным где угодно.

в качестве предварительного условия установите coreutils:

    brew install coreutils

теперь вы можете сделать:

    sudo gln -d /original_folder /mirror_folder

важно: чтобы удалить жесткую ссылку вы должны использовать gunlink:

    sudo gunlink /mirror_folder

используя rm или Finder также удалит исходную папку.

FYI:coreutils формула homebrew обеспечивает GNU-совместимые версии универсальные инструменты unix. Использовать brew list coreutils чтобы увидеть полный список.


в моем случае я обнаружил, что с виртуальной машины windows я не могу следить за символическими ссылками. (я хотел проверить некоторые HTML-страницы в Internet Explorer). И в моей структуре каталогов были символические ссылки для папок CSS и изображений.

мой обходной путь для решения проблемы был другим подходом, чем другие подразумеваемые ответы. Я использовал rsync для создания копии папки. Rsync может разрешить символические ссылки и скопировать связанные файлы вместо них.

это решило мою проблему без использование жестких ссылок на каталоги. И это на самом деле простое решение, если вы просто работаете над небольшим набором файлов.

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

короткий ответ - вы не можете. :) (за исключением, возможно, как корень, когда было бы точнее сказать, что вы не должны.)

Униксы разрешают только заданное количество ссылок на каталоги - ".."изнутри всех своих детей и "."внутри себя. Все остальное потенциально является рецептом для очень запутанного дерева каталогов. Это / было, по-видимому, дизайнерское решение Кена Томпсона.

(сказав это, по-видимому, машина времени Apple делает это :))


из статьи, связанной с, вы получите эту ошибку, если попытаетесь создать жесткую ссылку в том же каталоге, что и оригинал. Вы должны создать его где-то в другом месте.


Это также можно сделать со встроенным Perl (от терминала) без компиляции чего-либо. Мой конкретный вариант использования - для Google Drive (который не поддерживает символические ссылки), поэтому приведенные ниже примеры отражают вариант использования.

чтобы связать папку" Документы " с Google Диском, чтобы он синхронизировался:

perl -e 'link "/Users/me/Documents", "/Users/me/Google Drive/Documents"'

чтобы удалить ссылку на папку "Документы"с Google Диска:

sudo perl -U -e 'unlink "/Users/me/Google Drive/Documents"'

вам нужен "root "для разблокировки (см." unlink " perldoc).


другое решение-использовать bindfs https://code.google.com/p/bindfs/ что installable через порт:

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

в случае, если нет подпапки, вы можете попробовать

ln folder_path/*. * target_folder

Это сработало для меня на OSX 10.9


в Linux вы можете использовать bind mount для имитации жестких ссылок на каталоги. Не уверен в OSX

sudo mount --bind /some/existing_real_contents /else/dummy_but_existing_directory
sudo umount /else/dummy_but_existing_directory