web-dev-qa-db-ja.com

OS Xのディレクトリへのハードリンクを作成するUnixコマンドとは何ですか?

ディレクトリを指すハードリンク(シンボリックリンクまたはMac OSエイリアスではなく)をOS Xでどのように作成しますか?私はすでに「ln target destination」コマンドを知っていますが、それはターゲットがファイルの場合にのみ機能します。 Mac OSは、他のUnix環境とは異なり、フォルダーへのハードリンクを許可します(たとえば、Time Machineに使用されます)が、自分でそれを行う方法はわかりません。

48
username

その場合、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

ピッフル。 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

パスワードを入力し、まだ完了していません。あなたはそれを文書化しませんでしたか? mustハードリンクされたディレクトリを文書化します。たとえそれがシングルユーザーマシンであっても。

削除は別の話です。通常の方法でディレクトリを削除すると、内容が削除されます。 mustディレクトリの「リンク解除」:

    unlink  new_hard_link

そこ。ファイルシステムを破壊しないでください!

14
Rich

クロスポスト この素晴らしいツール これは問題をきちんと解決します。元は Samによって投稿されました


Hardlinkをインストールするには、 homebrew がインストールされていることを確認してから、次を実行します。

brew install hardlink-osx

インストールしたら、次のものを使用してハードリンクを作成します。

hln [source] [destination]

また、unlinkコマンドはユキヒョウでは機能しないことに気づいたので、リンクを解除するオプションを追加しました。

hln -u destination

興味のある人のためにGithubでコードを入手できます。 https://github.com/selkhateeb/hardlink

13
Simon East

はい、カーネルとファイルシステムでサポートされていますが、一般的な使用を目的としていないため、シェルには公開されません。

Time Machineが使用しているAPIを特定してコマンドラインツールでラップすることもできますが、ヒントを取り、明確に操作する方が良いでしょう。

9
Mike F

2018年以降は不可能です。 APFS(MacOS High Sierra 10.13で導入)は、ディレクトリハードリンクと互換性がありません。 https://github.com/selkhateeb/hardlink/issues/31 を参照してください

2
ariel

私の場合は、Windows仮想マシンからはシンボリックリンクをたどることができないことがわかりました。 (Internet ExplorerでHTMLページをテストしたかった)。そして、私のディレクトリ構造には、CSSおよび画像フォルダへのシンボリックリンクがありました。

この問題を解決するための私の回避策は、他の答えが示唆するものとは異なるアプローチでした。 rsyncを使用して、フォルダーのコピーを作成しました。 Rsyncはシンボリックリンクを解決し、代わりにリンクされたファイルをコピーできます。

これにより、ディレクトリへのハードリンクを使用せずに問題が解決しました。そして、あなたがほんの小さなファイルのセットで作業しているなら、それは実際に簡単な解決策です。

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

簡単な答えは、できないことです。 :)(ルートとしての可能性がある場合を除き、そうすべきではないと言う方が正確です)

Unixでは、ディレクトリへのリンクのセット数のみが許可されます-すべての子内からの「..」および「。」それ自体の中から。それ以外のものは、非常に混乱したディレクトリツリーのレシピになる可能性があります。これは明らかにケン・トンプソンによる設計上の決定です。

(と言っていたが、どうやらAppleのTime Machineはこれを行っているようだ:))

1
Penfold

Linuxでは、バインドマウントを使用して、ハードリンクディレクトリをシミュレートできます。 OSXについてわからない

Sudo mount --bind /some/existing_real_contents /else/dummy_but_existing_directory
Sudo umount /else/dummy_but_existing_directory
1
zainengineer

これは、ビルトインPerl(Terminalから)でも何もコンパイルせずに実行できます。私の特定のユースケースは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の「unlink」を参照)。

1
techiejohn

リンク先の記事から、元のディレクトリと同じディレクトリにハードリンクを作成しようとすると、そのエラーが発生します。別の場所で作成する必要があります。

1
Gannet

別の解決策は、bindfs https://code.google.com/p/bindfs/ を使用することです。これは、ポートを介してインストールできます。

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

サブフォルダがない場合は、試すことができます

ln folder_path /*.* target_folder

oSX 10.9で動作しました

0
Nuray Altin