56

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

4

14 に答える 14

53

注意しないとハードリンクのフォルダー/ディレクトリが問題を引き起こす可能性があることに同意しますが、それらには非常に明確な利点があります.Time Machineは完璧な例です. それらがなければ、冗長バージョンのファイルを複製すると、最大のディスクでさえもすぐに消費してしまうため、実用的ではありません。

Amit Singh の 6 つのルールに従う限り、Snow Leopard はディレクトリへのハード リンクを作成できます。

  1. ファイル システムは HFS+ でジャーナリングされている必要があります。
  2. ソースと宛先の親ディレクトリは異なる必要があります。
  3. ソースの親がルート ディレクトリであってはなりません。
  4. 宛先はルート ディレクトリにある必要はありません。
  5. 宛先は、ソースの子孫であってはなりません。
  6. 宛先には、ディレクトリ ハード リンクである祖先が含まれていてはなりません。

したがって、Snow Leopard がフォルダへのハード リンクを作成する機能を失ったというのはまったく正しくありません。

リンク/リンク解除が Snow Leopard で機能することを確認しました - 6 つのルールに従う限り。試したところ、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 を使用してハード リンクを削除することを忘れないでください。そして、後で、またはこれを知る必要があるかもしれない誰かのために、あなたが行ったことを文書化することを忘れないでください.

これらのフォルダーへの「ハードリンク」について、私が学んだもう1つの「落とし穴」。それらを作成すると、Mac OS X の「舞台裏」で多くのことが行われます。非常に重要な問題の 1 つは、リンクを作成するフォルダーが、/.HFS+ という非常に魔法のような超隠しフォルダーに実際に移動されることです。 Private Directory Data%000d/dir_xxx ここで、xxx は「source_folder」の inode 番号です。コマンドの形式は次のとおりです。

hlink source_folder target_folder

このため、「source_folder」でファイルを開かないように注意する必要があります。そうすると、それらは超魔法のフォルダーに移動され、変更を保存しようとすると問題が発生する可能性があります「source_folder」で開いていたファイルに。何が起こっているのかがわかるまで、これは私に数回起こりました。解決策は非常に簡単です。元の「source_folder」にあったすべてのフォルダー/ディレクトリに対して面白いエラーを取得せずに「ls -la」コマンドを実行できなくなったことに気付きましたが、「ls」コマンドを実行でき、すべてがうまく見えました。

「ディスクユーティリティ」プログラムで「ディスクの検証」を実行すると、「ボリュームビットマップは孤立したブロックのマイナーな修復が必要です」というエラーが表示されることに気付くでしょう。これは、超魔法のフォルダの作成で起こったことですそれへの「source_folder」の移動。

このような状況で「孤立したブロック」が発生した場合は、まず、変更されたファイルを「source_folder」ツリーを含むボリューム以外の一時的な場所に保存し、「ディスク ユーティリティ」を使用して、そのボリュームをアンマウントしてから再マウントします。 「source_folder」または単にコンピューターを再起動します。次に、一時的な場所に保存したファイルを元の場所にコピーすると、ビジネスに戻るはずです。これは私にとってはうまくいったので、これがあなたにもうまくいくことを保証することはできません. そのため、念のため、適切なバックアップがあるボリュームでこれを試すことをお勧めします。

フォルダーへのハード リンクを作成するという単純なタスクのためだけに、このオーバーヘッドがすべて発生するのは非常に奇妙に思えます。Mac OS X がフォルダへのハード リンクを作成するためにこのような努力をする理由を知っている人はいますか? これが「ジャーナリングされた」ファイルシステムであるという事実と何か関係がありますか?

私は、Amit Singh の「hfsdebug」ユーティリティの説明を読んで、超魔法の超隠された場所に関する情報を発見しました。詳細については、Amit Singh の hfsdebug utilityにある彼の Web サイトを参照してください。これは非常に興味深いソフトウェアで、HFS+ ファイル システムに関する多くの詳細を教えてくれます。無料ですので、ダウンロードして試してみることをお勧めします。サポートは終了しましたが、Snow Leopard と Leopard の両方で引き続き動作します。基本的に、HFS+ をサポートするすべてのシステムです。「読み取り専用」ツールであるため、実際に害を及ぼすことはありません。そのため、ファイルシステムの詳細を確認するために使用すると便利です。

これらの「フォルダーへのハードリンク」に関するもう 1 つの問題 - フォルダーを作成すると、超魔法の超秘密の隠しフォルダーが作成されると、それは永久に存在します。そもそも作成の原因となったフォルダーのリンクを解除しても、この魔法のフォルダーは残ります。理由はわかりませんが、間違いなくそうです。試してみたい場合は、「hfsdebug」を使用してこれを見つけることができます。また、「hfsdebug」を使用して、これらの「フォルダへのハード リンク」がドライブ上にいくつ存在するかを調べることもできます。これらの詳細については、「hfsdebug」ユーティリティに関する Amit の記事を参照してください。

彼はまた、サポートされているがコストがかかる別の新しいユーティリティを持っています。これは fileXray と呼ばれ、同じ家庭内の任意の数のコンピューターで 1 人 79 ドルの費用がかかります。個人の非ビジネス タイプのライセンスです。173 ページの広範なユーザー ガイドがあり、ダウンロードして購入前に何ができるかを確認できます。残念ながら試用版はありませんので、マニュアルを読んだり、Web サイトで詳細を確認したりして、問題を解決できるかどうかを確認してください。詳細については、同社の Web サイトをご覧ください。詳細については、 fileXray の Web サイトを参照してください。

フォルダへのこれらのハード リンクを使用する場合、注意すべき問題がいくつかあります。それらが作成されたボリュームがリモート クライアントにマウントされている場合、マウント方法によっては重大な問題が発生する可能性があります。AFP を使用してボリュームをリモート クライアントにマウントする場合、現在そのボリュームへのハード リンクがあるフォルダー、または以前にハード リンクを持っていたが後で削除されたフォルダーは、すべての下位レベルのフォルダーとして使用できなくなるため、大きな問題が発生します (ファイルではなく) は、Finder またはターミナル ウィンドウからアクセスできなくなります。単純な「ls -lR」コマンドを実行しようとすると失敗し、すべての下位レベル フォルダーに対して「ls: xxx: そのようなファイルまたはディレクトリはありません」というエラー メッセージが表示されます。Finder ウィンドウを使用してリモート ボリュームのディレクトリ ツリーをトラバースする場合、

これらの問題は、NFS を使用してリモート クライアントをマウントしている場合 (および、ローカル HFS+ ファイルシステムとしてボリュームを持つシステム上に NFS サーバーがあると仮定した場合) は発生しないようです (エラー メッセージを除く)。NFS を使用してボリュームをマウントする方法については、ここでは説明しません。サーバーとクライアントでの NFS マウントを支援するために、「NFS Manager」と呼ばれる Marcel Bresink 博士の優れたプログラムを使用しました。彼の Web サイトから入手できます。お気に入りの検索エンジンで「Bresink NFS Manager」を検索してください。ただし、無料の試用版があるので、購入する前に試すことができます。NFS マウントを行う方法を学びたい場合は、それほど大したことではありませんが、「NFS マネージャー」を使用すると、セットアップが非常に簡単になり、さまざまな設定をすべて微調整して最適化することができます。彼は他にもいくつかのきちんとした Mac OS X ユーティリティを持っていますが、それらは非常に手頃な価格です - 「Hardware Monitor」と呼ばれるもので、電力使用量、CPU の温度、ファンの速度、および両方の他の多くの変数など、あらゆる種類のものを監視およびグラフ化できます。長時間 (数分から数日) にわたってローカルおよびリモートの Mac システムに影響を与えます。便利なユーティリティに興味がある場合は、チェックする価値があります。

私が気づいたことの 1 つは、NFS ファイル転送が AFP 経由で行うよりも約 20% 遅いことですが、「マイレージは異なる場合がある」ため、いずれかの方法で保証されるわけではありませんが、まったく機能しない場合と比較して、パフォーマンスが 20% 低下します。

Apple は、ハード リンクとリモート AFP ファイルシステムの問題を認識しており、それを AFP クライアントの「実装上の制限」と呼んでいます。Mac OS X の次のリリースでこの問題が修正されることを願うばかりです。フォルダへのハード リンクを必要に応じて使用できる機能が本当に気に入っているからです。

これらのメモは私個人の意見であり、その正確性については保証しませんので、自己責任で使用してください。不測の事態が発生した場合に備えて、これらの「フォルダーへのハードリンク」をいじる前に、適切なバックアップを作成してください。しかし、Mac OS X のこの興味深い側面をもう少し調べてみようと決心したなら、楽しんでいただければ幸いです。

于 2011-01-16T18:32:44.023 に答える
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
于 2009-04-30T01:20:24.220 に答える
16

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

そこには。ファイルシステムを破壊しないことを願っています!

于 2010-01-10T18:41:25.173 に答える
8

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

おそらく、Time Machine がどの API を使用しているかを調べて、それらをコマンドライン ツールにラップすることもできますが、ヒントを得て、よく理解した方がよいでしょう。

于 2008-09-17T08:35:34.877 に答える
3

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

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

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

rsync -av --copy-dirlinks --delete ../htmlguide ~/src/
于 2009-10-14T09:00:11.043 に答える
1

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

于 2010-10-15T02:08:40.553 に答える
1

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

sudo mount --bind /some/existing_real_contents /else/dummy_but_existing_directory
sudo umount /else/dummy_but_existing_directory
于 2016-04-11T04:46:45.483 に答える
1

これは、何もコンパイルせずに (ターミナルから) 組み込みの 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" が必要です ("unlink" perldoc を参照)。

于 2016-09-13T14:28:02.720 に答える
0

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

sudo port install bindfs
sudo bindfs ~/source_dir ~/target_dir
于 2013-02-12T21:44:21.537 に答える
-1

短い答えは、あなたができないということです。:) (おそらくルートとして、そうすべきではないと言った方が正確な場合を除きます。)

Unix では、ディレクトリへの一定数のリンクのみが許可されます。「..」はそのすべての子の中から、「.」は「.」です。自分の中から。それ以外は、非常に混乱したディレクトリ ツリーの原因となる可能性があります。これは明らかに Ken Thompson による設計上の決定です。

(そうは言っても、明らかにAppleのTime Machineはこれを行います:))

于 2008-09-17T08:06:14.243 に答える
-1

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

ln フォルダーのパス/*. * target_folder

OSX 10.9でうまくいきました

于 2013-12-16T00:24:21.143 に答える