Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

  • Файловая система должна быть записана в журнал HFS +.
  • Родительские каталоги источника и адресата должны быть разными.
  • Исходный родитель не должен быть корневым каталогом.
  • Пункт назначения не должен находиться в корневом каталоге.
  • Назначение не должно быть потомком источника.
  • У адресата не должно быть предков, у которых жесткая ссылка каталога.

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

Я только что подтвердил, что ссылка /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+ Private Directory Data% 000d/dir_xxx, где xxx - номер inode в "source_folder" - помните, что формат команды

hlink source_folder target_folder

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

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

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

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

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

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

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

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

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

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

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

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

Ответ 3

невоспитанности. В 10.5 он сообщает вам на странице руководства 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

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

Ответ 4

Перекрестная проводка этот отличный инструмент, который аккуратно решает проблему, изначально размещенную Sam:


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

brew install hardlink-osx

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

hln [source] [destination]

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

hln -u destination

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

Ответ 5

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

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

Ответ 6

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

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

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

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

Ответ 7

Версия 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 также удалит исходную папку.

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

Ответ 8

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

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

(Сказав это, очевидно, Apple Time Machine делает это:))

Ответ 9

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

Ответ 10

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

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

Ответ 11

Это также можно сделать со встроенным 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).

Ответ 12

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

ln folder_path/*. * target_folder

он работал у меня на OSX 10.9

Ответ 13

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

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