ディレクトリへのシンボリックリンクを生成するシェルスクリプトにコマンドを入れたいのですが、スクリプトは引き続き実行できるため、後続の呼び出しでコマンドは何も変更しないでください。
ディレクトリ構造は次のとおりです。
% tree /tmp/test_symlink
/tmp/test_symlink
├── foo
└── repo
└── resources
└── snippets
├── php.snippets
├── sh.snippets
├── snippets.snippets
├── sql.snippets
└── vim.snippets
foo/
私はsnippetsと呼ばれるこのディレクトリへのシンボリックリンクを作成したいと思います/tmp/test_symlink/repo/resources/snippets
。
だから私は次を実行します。
% ln -sfv /tmp/test_symlink/repo/resources/snippets /tmp/test_symlink/foo/snippets
'/tmp/test_symlink/foo/snippets' -> '/tmp/test_symlink/repo/resources/snippets'
これは所望の結果を与える。
% tree /tmp/test_symlink
/tmp/test_symlink
├── foo
│ └── snippets -> /tmp/test_symlink/repo/resources/snippets
└── repo
└── resources
└── snippets
├── php.snippets
├── sh.snippets
├── snippets.snippets
├── sql.snippets
└── vim.snippets
5つのディレクトリ、5つのファイル
ただし、コマンドを再実行すると
% ln -sfv /tmp/test_symlink/repo/resources/snippets /tmp/test_symlink/foo/snippets
'/tmp/test_symlink/foo/snippets/snippets' -> '/tmp/test_symlink/repo/resources/snippets'
シンボリックリンクがすでに存在するディレクトリにシンボリックリンクを作成し、シンボリックリンクを物理ディレクトリに配置します。
% tree /tmp/test_symlink
/tmp/test_symlink
├── foo
│ └── snippets -> /tmp/test_symlink/repo/resources/snippets
└── repo
└── resources
└── snippets
├── php.snippets
├── sh.snippets
├── snippets -> /tmp/test_symlink/repo/resources/snippets
├── snippets.snippets
├── sql.snippets
└── vim.snippets
なぜこれが起こるのか、そして後続の呼び出しでこれらの奇妙な効果が発生しないようにコマンドを変更するにはどうすればよいですか?
ベストアンサー1
これを行うには、リンク名を常にディレクトリではなく目的のリンク名として処理するように-T
指示するこのオプションを使用する必要があります。ln
ln
このオプションがない場合、ディレクトリとして存在するリンク名を指定すると、そのディレクトリ内の宛先への新しいリンクが作成されます。
これは-T
GNU-ism(少なくともPOSIXにはない)ですが、すでに使用していて-v
GNU-ismなので問題にならないようです。
または、親ディレクトリをリンク名として指定すると、リンクは常にそのディレクトリに(再)作成されます。
ln -sfv /tmp/test_symlink/repo/resources/snippets /tmp/test_symlink/foo/
これはシンボリックリンクがターゲットと同じ名前であるために機能します。