@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'>
Вы не можете сделать это прямо в 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
Версия 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
, чтобы просмотреть полный список.
Перекрестная проводка это отличный инструмент , который аккуратно решает проблему, изначально отправленную Sam :
] Чтобы установить Hardlink, убедитесь, что вы установили homebrew , затем запустите:
brew install hardlink-osx
После установки создайте жесткую ссылку с помощью:
hln [source] [destination]
Я также заметил, что команда unlink
не работает на снежном леопарде, поэтому я добавил опцию отсоединения:
hln -u destination
Код доступен в Github для тех, кто заинтересован: https://github.com/selkhateeb/hardlink
В статье, связанной с этой статьей, вы получите эту ошибку, если попытаетесь создать жесткую ссылку в том же каталоге, что и оригинал. Вы должны создать его где-то еще.
Мое дело было в том, что я узнал, что с виртуальной машины Windows я не могу следовать символическим ссылкам. (я хотел проверить некоторые HTML-страницы в Internet Explorer). И моя структура каталогов содержала символические ссылки на папки с CSS и изображениями.
Моим обходным решением для решения проблемы был другой подход, чем другие подразумеваемые. Я использовал rsync
для создания копии папки. Rsync может разрешить символические ссылки и скопировать связанные файлы.
Это решило мою проблему, не используя жесткие ссылки на каталоги. И это на самом деле простое решение, если вы просто работаете с небольшим набором файлов.
rsync -av --copy-dirlinks --delete ../htmlguide ~/src/
Другое решение - использовать bindfs https://code.google.com/p/bindfs/ , который устанавливается через порт:
sudo port install bindfs
sudo bindfs ~/source_dir ~/target_dir
, если нет подпапки, вы можете попробовать
ln folder_path / * . * target_folder
он работал для меня на OSX 10.9
Короткий ответ: вы не можете. :) (кроме, возможно, с правами root, когда было бы более точно сказать, что вы не должны.)
Unixes разрешают только определенное количество ссылок на каталоги - «..» из всех своих детей и "" изнутри самого себя. Все остальное потенциально является рецептом для очень запутанного дерева каталогов. Это / было, по-видимому, дизайнерским решением Кен Томпсона.
(Сказав, что, по-видимому, Apple Time Machine делает это :))
невоспитанности. В 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
Там. Надеюсь, вы не разрушите свою файловую систему!
Это также можно сделать со встроенным 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).
Да, это поддерживается ядром и файловой системой, но поскольку он не предназначен для общего использования, он не подвергается оболочке.
Возможно, вы могли бы решить, какие API-интерфейсы Time Machine используют и завершают их в commandline tool, но лучше было бы взять подсказку и хорошо прояснить.
В Linux вы можете использовать привязку привязки для имитации жестких ссылок. Не уверен относительно OSX
sudo mount --bind /some/existing_real_contents /else/dummy_but_existing_directory
sudo umount /else/dummy_but_existing_directory