2008-09-17 1 views
45

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

+3

Sweet ... hlink теперь живет в/usr/local/bin :) – 2008-09-18 20:41:09

+0

Спасибо Mike F, это был удобный совет. – Nic 2009-10-28 02:49:06

+0

Информация: на iPhone 3G fw 3.1.2 заблокированные жесткие ссылки на каталоги запрещены также, если вы зарегистрированы как «root». – 2010-01-14 13:17:19

ответ

31

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

ПРИМЕЧАНИЕ: вам нужно ** hunlink ** удалить этот каталог, не вытесняя его содержимое -> http://stackoverflow.com/questions/1432540/creating-directory-hard- link-in-macos-x/2440126 # 2440126 – 2011-11-16 10:22:54

+1

Кто-нибудь знает, как timemachine обрабатывает жесткие ссылки, которые существуют на резервном копировании тома? – 0cd 2013-07-03 09:36:01

1

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

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

(Сказав, что, по-видимому, Time Machine от Apple действительно делает это :))

9

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

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

+2

справочная страница для ссылки (2) сказано иначе ... – Alnitak 2009-05-09 13:21:21

2

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

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

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

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

Piffle. На 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 

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

+8

Вы уверены, что не смотрите на GNU ln или что-то еще? Я проверил Snow Leopard, а затем проверил man-страницу на моем разделе Leopard, и у обоих не было -d и определить -F как что-то еще. Вот веб-версия: http://developer.apple.com/mac/library/documentation/Darwin/Reference/ManPages/man1/ln.1.html – 2010-03-12 07:20:45

1

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

48

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

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

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

Так что это не совсем так, что 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+ Частный каталог данных% 000D/dir_xxx где ххх является индексный дескриптор «source_folder» - помните, формат команды является

hlink source_folder target_folder 

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

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

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

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

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

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

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

При использовании этих жестких ссылок на папки вам следует знать несколько проблем. Если том, на котором они созданы, монтируется на удаленный клиент, могут возникнуть значительные проблемы, в зависимости от того, как они монтируются. Если вы используете 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.

1

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

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

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

ln folder_path/* .* target_folder

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

0

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

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

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


Для установки HardLink, убедитесь, что вы установили homebrew, а затем запустить:

brew install hardlink-osx 

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

hln [source] [destination] 

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

hln -u destination 

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

1

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

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

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

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

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

Вам нужны «корневой ", чтобы отсоединить (см." unlink "perldoc).

2

версия 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: Формула homebrew coreutils содержит GNU-совместимые версии универсальных инструментов unix. Используйте brew list coreutils, чтобы увидеть полный список.

Смежные вопросы