web-dev-qa-db-ja.com

Mac OS Xでディレクトリのハードリンクを作成する

Mac OS Xのディレクトリへのハードリンクを作成するにはどうすればよいですか?

この機能は Mac OS X v10.5 (Leopard)(タイムマシン用)でファイルシステムに追加されましたが、コマンドラインから実際に使用するための情報が見つかりませんでした。

55

残念ながらAppleはlnコマンドを無効にしました。次のプログラムを使用して、ディレクトリへのハードリンクを作成できます。

#include <unistd.h>
#include <stdio.h>

int main(int argc, char* argv[]) {
 if (argc != 3) {
  fprintf(stderr,"Use: hlink <src_dir> <target_dir>\n");
  return 1;
 }
 int ret = link(argv[1],argv[2]);
 if (ret != 0)
  perror("link");
 return ret;
}

ハードリンクされたディレクトリが同じ親ディレクトリにない場合があるので、これを行うことができます。

$ gcc hlink.c -o hlink
$ mkdir child1
$ mkdir parent
$ ./hlink child1 parent/clone2
70
Freeman

誰かが興味を持っている場合は、提案された回答をGitリポジトリにまとめました: https://github.com/selkhateeb/hardlink

インストールしたら、次のようにハードリンクを作成します。

hln source destination

また、Mac [OS X v10.6(Snow Leopard)ではunlinkコマンドが機能しないことに気づいたので、リンクを解除するオプションを追加しました。

hln -u destination

ハードリンクをインストールするには、 Homebrew を使用して実行します:

brew install hardlink-osx
82
Sam

リンクされている他のディレクトリのコンテンツを削除せずにディレクトリへのハードリンクを削除する方法についてのthe_undefinedによる質問への回答:私の知る限り、組み込みコマンドを使用してコマンドラインから実行することはできません。ただし、この小さなプログラム(Freemanの投稿に触発された)はそれを行います:

#include <unistd.h>
#include <stdio.h>

int main(int argc, char* argv[]) {
    if (argc != 2) {
        fprintf(stderr,"Use: hunlink <dir>\n");
        return 1;
    }
    int ret = unlink(argv[1]);
    if (ret != 0)
        perror("unlink");
    return ret;
}

Freemanの例をフォローするには、

$ gcc hunlink.c -o hunlink
$ echo "foo bar" > child1/baz.txt
$ ./hunlink parent/clone2

parent/clone2のハードリンクを削除しますが、ディレクトリchild1およびファイルchild1/baz.txt単独。

17
rleber

別の解決策は、ポート経由でインストール可能なbindfs https://code.google.com/p/bindfs/ を使用することです。

Sudo port install bindfs
Sudo bindfs ~/source_dir ~/target_dir
7
Kit Sunde