ファイルをサブディレクトリの新しいファイルにシンボリックリンクするには、サブディレクトリを移動しなくても簡単にする必要があるようです。しかし、構文に関する内容は混乱しており、私が予想したものとは反対です。テストケースは次のとおりです。
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
これは非常に長い説明ですが、構文をよりよく理解するのに役立つことを願っています。
答え2
次のようにサブシェルにリンクを作成できます。
(cd deploy && ln -s resources.build.php resources.php && cat resources.php)
サブシェルの実行が完了すると、まだ正しいディレクトリにあることがわかります。
または試してみることもできます。
ln -s resources.build.php deploy/resources.php
ファイルがCLに含まれていることを無視し、この方法も機能します。リソース.ビルド.phpコマンドを実行したディレクトリではなく、実際には内部にあります。。 /配布。
答え3
私はシンボリックリンクが基本的に設定ファイルであることに気づくまでこれが私を混乱させました。つまり、そのパスデータを単純なテキストファイルに書き込む方法は?
ln -s [target] [link name]
になる:
echo [target] > [link name]
私が(おそらくOPも)犯した間違いは次のとおりです。なぜならターゲットファイルを知る必要があります。なぜなら気にしないでください。ちょうどファイルにいくつかのパス情報を記録します。これは完全に合理的ですなぜなら注文する:
ln -s /path/doesnt/exist/file.err
ll
file.err -> /path/doesnt/exist/file.err
したがって:
ln -s deploy/resources.build.php deploy/resources.php
resources.php
そのフォルダ内の./deploy
ファイルを参照するresources.build.php
フォルダから呼び出されるsimlinkファイルを作成します./deploy/deploy/
。
これはあなたが望むものではなく、間違った(壊れた)リンクを提供します。リンクに問題はありません。ファイルをそこに置くとリンクが機能します。しかし、(他の人が指摘したように)OPと私が望むものは次のとおりです。
ln -s resources.build.php deploy/resources.php
答え4
最近この問題が発生しました。覚えておいてください。これはsource
ですtarget
。
❯ ln -s source target
descriptor
そのため、ソース(AKA)が表示されるとおりに理解できるように、ソースで絶対パスを使用するか、現在のディレクトリを最終の宛先ディレクトリに変更する必要があります。
例:ソースをa
ターゲットに接続しますb
。
root
├── foo
│ └── a
└── bar
❯ pwd
root
❯ ln -s ../foo/a ./bar/b
この例では、ファイルの説明b
はです ../foo/a
。したがって、私はファイルなので、次のことをb
行う必要があります。
- レベルの上にディレクトリが
bar
。 - に変更
foo
。 - 探す
a
。
root
├── foo
│ └── a
└── bar
└── b -> ../foo/a