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

StackOverflow https://stackoverflow.com/questions/80875

Вопрос

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

Это было полезно?

Решение 2

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

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

...и встроить в Terminal.app с:

$ gcc -o hlink hlink.c -Wall

Другие советы

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

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

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

Таким образом, совершенно неверно, что Snow Leopard потерял возможность создавать жесткие ссылки на папки.

Я только что подтвердил, что 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", потому что, если вы это сделаете, они просто переместятся в папку super-magical, и у вас, вероятно, возникнет проблема, если вы попытаетесь сохранить любые изменения в тех файлах, которые были открыты в "source_folder".Это случалось со мной пару раз, пока до меня не дошло, что происходит, и решение довольно простое.Я заметил, что вы больше не могли выполнять команду "ls -la" без получения забавных ошибок для всех папок / директорий, которые были в исходной "source_folder", но вы могли выполнить команду "ls", и все выглядело хорошо.

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

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

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

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

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

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

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

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

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

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

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

Пустышка.В версии 10.5 на справочной странице указано, что для лн:

   -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 который доступен в домашнее пиво как gln как часть основные компоненты формула. man gln перечисляет -d опция с предупреждением, специфичным для OSX, представленная в богатыйвот ответ.Другими словами, это работает не во всех случаях.Что именно определяет, работает это или нет, похоже, нигде не задокументировано.

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

    brew install coreutils

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

    sudo gln -d /original_folder /mirror_folder

ВАЖНЫЙ:Чтобы удалить жесткую ссылку, вы должен использование gunlink:

    sudo gunlink /mirror_folder

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

К ТВОЕМУ сведению:Тот Самый основные компоненты homebrew formula предоставляет GNU-совместимые версии универсальных инструментов unix.Использование brew list coreutils чтобы просмотреть полный список.

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

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

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

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

По состоянию на 2018 год это больше невозможно.APFS (представленная в macOS High Sierra 10.13) несовместима с жесткими ссылками на каталоги.Видишь https://github.com/selkhateeb/hardlink/issues/31

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

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

(Сказав это, очевидно, что Машина времени Apple действительно делает это :) )

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

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

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

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

Как удалить ссылку на вашу папку "Документы" с Google Диска:

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

Вам нужен "root", чтобы разорвать связь (см. "Разорвать связь" с perldoc).

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

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

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

путь к папке ln/*.* целевая папка

у меня это сработало на 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top