Что такое команда Unix для создания жесткой ссылки на каталог в OS X? - PullRequest
48 голосов
/ 17 сентября 2008

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

Ответы [ 14 ]

48 голосов
/ 16 января 2011

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

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

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

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

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

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

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

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

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

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

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

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

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

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

31 голосов
/ 30 апреля 2009

Вы не можете сделать это напрямую в 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;
}

... и встроить Terminal.app с помощью:

$ gcc -o hlink hlink.c -Wall
14 голосов
/ 10 января 2010

невоспитанность. На 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

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

13 голосов
/ 10 июня 2016

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


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

brew install hardlink-osx

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

hln [source] [destination]

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

hln -u destination

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

9 голосов
/ 17 сентября 2008

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

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

5 голосов
/ 06 октября 2016

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

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

    brew install coreutils

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

    sudo gln -d /original_folder /mirror_folder

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

    sudo gunlink /mirror_folder

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

К вашему сведению: формула для домашнего пивовара coreutils обеспечивает GNU-совместимые версии универсальных инструментов unix. Используйте brew list coreutils, чтобы увидеть полный список.

2 голосов
/ 11 октября 2018

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

2 голосов
/ 14 октября 2009

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

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

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

rsync -av --copy-dirlinks --delete ../htmlguide ~/src/
1 голос
/ 13 сентября 2016

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

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

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).

1 голос
/ 15 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...