ファイルをサブディレクトリの新しいファイルにシンボリックリンクするには、サブディレクトリを移動しなくても簡単にする必要があるようです。しかし、構文に関する内容は混乱しており、私が予想したものとは反対です。テストケースは次のとおりです。
mkdir temp
cd temp
mkdir deploy
echo "Contents of the build file!" > deploy/resources.build.php
ln -s deploy/resources.build.php deploy/resources.php
cat deploy/resources.php #bad symlink
これは壊れたシンボリックリンクを生成するだけです!私はこれをビルド環境設定スクリプト内で実行しているので、現在の作業ディレクトリをできるだけ変更したくないと思います。
ln -s deploy/resources.build.php resources.php
cat deploy/resources.php
また、配布サブディレクトリの代わりに一時ディレクトリにシンボリックリンクを作成するため、機能しません。
cd deploy
ln -s resources.build.php resources.php
cd ..
これはうまくいきますが、ディレクトリを変更せずにこれを行う方法を知りたいです。
フルパスを使用してください。たとえば、次のようになります。
/home/whatever/src/project/temp/stuff/temp/deploy/resources.build.php
動作しますが、不便でやや非実用的です。特に、ビルドごとにすべてのプロジェクトコンテンツが異なる可能性があるビルド環境ではさらにそうです。
新しいファイル「エイリアス」に新しい名前を付けながら、サブディレクトリの内外に移動せずにサブディレクトリ内の2つのファイル間にシンボリックリンクを作成するにはどうすればよいですか?
ベストアンサー1
しかし、構文に関する内容は混乱しており、私が予想したものとは反対です。
ln
使用しているフォームのパラメータは次のとおりです。
ln [オプション]... [-T] TARGET LINK_NAME(最初の形式)
混乱し直感的でない点は、シンボリックリンクを作成するときターゲットforへの引数はln
ファイルパスではなく、生成されるシンボリックリンクの内容になると予想されます。考えてみるとそんなしかないというのは自明だ。考慮する:
$ echo foo >foo
$ ln -s foo bar1
$ ln -s $PWD/foo bar2
$ cat bar1
foo
$ cat bar2
foo
$ ls -l bar1 bar2
lrwxrwxrwx 1 matt matt 3 Dec 29 16:29 bar1 -> foo
lrwxrwxrwx 1 matt matt 29 Dec 29 16:29 bar2 -> /home/matt/testdir/foo
この例では、同じファイルを指す「bar1」と「bar2」という名前の2つのシンボリックリンクを作成しました。 ls
シンボリックリンク自体の内容が異なることを示します。 1つは絶対パスを含み、もう1つは相対パスを含みます。したがって、別のディレクトリに移動しても、1つは機能し続けますが、もう1つは機能しません。
$ mv bar2 /tmp
$ cat /tmp/bar2
foo
$ mv bar1 /tmp
$ cat /tmp/bar1
cat: /tmp/bar1: No such file or directory
したがって、相対リンクと絶対シンボリックリンクを生成でき、後でターゲットファイルを作成しても破損しない破損したシンボリックリンクも生成できることを考慮すると、ターゲット引数は、既存のファイルへのパスではなく自由形式のテキストとして解釈する必要があります。
デプロイメント/resources.build.phpにリンクするデプロイメント/resources.phpというファイルを生成するには、絶対シンボリックリンクを作成するかどうかを決定する必要があります(移動されたシンボリックリンクには復元力があるがターゲットが移動された場合)、または相対シンボリックリンク(シンボリックリンクとターゲットが一緒に移動され、同じ相対パスを維持する限り、動作し続けます)。
絶対シンボリックリンクを作成するには:
$ ln -s $PWD/deploy/resources.build.php deploy/resources.php
相対パスを作成するには、まずソースからターゲットへの相対パスを探します。この場合、ソースとターゲットは同じディレクトリにあるため、次のことができます。
$ ln -s resources.build.php deploy/resources.php
同じディレクトリにない場合は、次のことを行う必要があります。
$ ln -s ../foo/f bar/b
この場合とfoo
が両方とも現在のディレクトリにある場合でも、 をbar
含める必要があります。../
ln
ターゲットf
これはContainsからインポートする方法を説明しているからですb
。
ln
これは非常に長い説明ですが、構文をよりよく理解するのに役立つことを願っています。