ディレクトリを指すハードリンク(シンボリックリンクまたはMac OSエイリアスではなく)をOS Xでどのように作成しますか?私はすでに「ln target destination」コマンドを知っていますが、それはターゲットがファイルの場合にのみ機能します。 Mac OSは、他のUnix環境とは異なり、フォルダーへのハードリンクを許可します(たとえば、Time Machineに使用されます)が、自分でそれを行う方法はわかりません。
その場合、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
ピッフル。 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
そこ。ファイルシステムを破壊しないでください!
クロスポスト この素晴らしいツール これは問題をきちんと解決します。元は Sam :によって投稿されました
Hardlinkをインストールするには、 homebrew がインストールされていることを確認してから、次を実行します。
brew install hardlink-osx
インストールしたら、次のものを使用してハードリンクを作成します。
hln [source] [destination]
また、unlink
コマンドはユキヒョウでは機能しないことに気づいたので、リンクを解除するオプションを追加しました。
hln -u destination
興味のある人のためにGithubでコードを入手できます。 https://github.com/selkhateeb/hardlink
はい、カーネルとファイルシステムでサポートされていますが、一般的な使用を目的としていないため、シェルには公開されません。
Time Machineが使用しているAPIを特定してコマンドラインツールでラップすることもできますが、ヒントを取り、明確に操作する方が良いでしょう。
2018年以降は不可能です。 APFS(MacOS High Sierra 10.13で導入)は、ディレクトリハードリンクと互換性がありません。 https://github.com/selkhateeb/hardlink/issues/31 を参照してください
私の場合は、Windows仮想マシンからはシンボリックリンクをたどることができないことがわかりました。 (Internet ExplorerでHTMLページをテストしたかった)。そして、私のディレクトリ構造には、CSSおよび画像フォルダへのシンボリックリンクがありました。
この問題を解決するための私の回避策は、他の答えが示唆するものとは異なるアプローチでした。 rsync
を使用して、フォルダーのコピーを作成しました。 Rsyncはシンボリックリンクを解決し、代わりにリンクされたファイルをコピーできます。
これにより、ディレクトリへのハードリンクを使用せずに問題が解決しました。そして、あなたがほんの小さなファイルのセットで作業しているなら、それは実際に簡単な解決策です。
rsync -av --copy-dirlinks --delete ../htmlguide ~/src/
簡単な答えは、できないことです。 :)(ルートとしての可能性がある場合を除き、そうすべきではないと言う方が正確です)
Unixでは、ディレクトリへのリンクのセット数のみが許可されます-すべての子内からの「..」および「。」それ自体の中から。それ以外のものは、非常に混乱したディレクトリツリーのレシピになる可能性があります。これは明らかにケン・トンプソンによる設計上の決定です。
(と言っていたが、どうやらAppleのTime Machineはこれを行っているようだ:))
Linuxでは、バインドマウントを使用して、ハードリンクディレクトリをシミュレートできます。 OSXについてわからない
Sudo mount --bind /some/existing_real_contents /else/dummy_but_existing_directory
Sudo umount /else/dummy_but_existing_directory
これは、ビルトイン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」を参照)。
リンク先の記事から、元のディレクトリと同じディレクトリにハードリンクを作成しようとすると、そのエラーが発生します。別の場所で作成する必要があります。
別の解決策は、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で動作しました