Почему узел js может сделать жесткую ссылку с каталогом? [Дубликат]

@staticmethod просто отключает функцию по умолчанию как дескриптор метода. classmethod переносит вашу функцию в контейнер, вызываемый, который передает ссылку на собственный класс в качестве первого аргумента:

>>> class C(object):
...  pass
... 
>>> def f():
...  pass
... 
>>> staticmethod(f).__get__(None, C)
<function f at 0x5c1cf0>
>>> classmethod(f).__get__(None, C)
<bound method type.f of <class '__main__.C'>>

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

>>> class CMeta(type):
...  def foo(cls):
...   print cls
... 
>>> class C(object):
...  __metaclass__ = CMeta
... 
>>> C.foo()
<class '__main__.C'>
47
задан username 11 March 2013 в 08:42
поделиться

13 ответов

Вы не можете сделать это прямо в BASH. Однако ... Я нашел здесь статью, в которой обсуждается, как это сделать косвенно: http://www.mactech.com/articles/mactech/Vol.23/23.11/ExploringLeopardwithDTrace/index.html by компилируя простую небольшую программу 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
31
ответ дан username 26 August 2018 в 03:53
поделиться

Версия 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, чтобы просмотреть полный список.

4
ответ дан ccpizza 26 August 2018 в 03:53
поделиться

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


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

brew install hardlink-osx

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

hln [source] [destination]

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

hln -u destination

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

13
ответ дан Community 26 August 2018 в 03:53
поделиться

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

1
ответ дан Gannet 26 August 2018 в 03:53
поделиться

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

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

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

rsync -av --copy-dirlinks --delete ../htmlguide ~/src/
2
ответ дан Jesper Rønn-Jensen 26 August 2018 в 03:53
поделиться

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

sudo port install bindfs
sudo bindfs ~/source_dir ~/target_dir
0
ответ дан Kit Sunde 26 August 2018 в 03:53
поделиться

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

ln folder_path / * . * target_folder

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

0
ответ дан Nuray Altin 26 August 2018 в 03:53
поделиться

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

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

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

1
ответ дан Penfold 26 August 2018 в 03:53
поделиться

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

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

14
ответ дан Rich 26 August 2018 в 03:53
поделиться
48
ответ дан ru2wen2 26 August 2018 в 03:53
поделиться

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

1
ответ дан techiejohn 26 August 2018 в 03:53
поделиться

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

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

9
ответ дан user 26 August 2018 в 03:53
поделиться

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

sudo mount --bind /some/existing_real_contents /else/dummy_but_existing_directory
sudo umount /else/dummy_but_existing_directory
0
ответ дан zainengineer 26 August 2018 в 03:53
поделиться