シンボリックリンクが機能しないのはなぜですか?


24

シンボリックリンクをよりよく理解しようとしていますが、あまり運がありません。これは、ユーザー名/ホストを変更した実際のシェル出力です:

username@host:~$ mkdir actual
username@host:~$ mkdir proper
username@host:~$ touch actual/file-1.txt
username@host:~$ echo "file 1" > actual/file-1.txt
username@host:~$ touch actual/file-2.txt
username@host:~$ echo "file 2" > actual/file-2.txt
username@host:~$ ln -s actual/file-1.txt actual/file-2.txt proper
username@host:~$ # Now, try to use the files through their links
username@host:~$ cat proper/file-1.txt
cat: proper/file-1.txt: No such file or directory
username@host:~$ cat proper/file-2.txt
cat: proper/file-2.txt: No such file or directory
username@host:~$ # Check that actual files do in fact exist
username@host:~$ cat actual/file-1.txt
file 1
username@host:~$ cat actual/file-2.txt
file 2
username@host:~$ # Remove the links and go home :(
username@host:~$ rm proper/file-1.txt
username@host:~$ rm proper/file-2.txt

シンボリックリンクは、ファイルに直接アクセスしているようにポイントするファイルを操作できるという意味で、透過的に動作するはずだと考えました(rmもちろん、リンクが単に削除される場合を除きます))。


ディスクはどのようにフォーマットされていますか?どのファイルシステムを使用していますか?(FATはシンボリックリンクをサポートしていませんが、FATファイルシステムで作成しようとするとエラーが発生するはずです。)
ニコールハミルトン

@NicoleHamilton-ext4(によるdf -T)-上記の結果はあなたにとっても奇妙なものですか?
-orokusaki

@orokusaki変ではありません。以下の私の答えをご覧ください。頭に浮かぶだけで、ファイルに触れる必要はありません。それらも存在する必要はありません。入力を節約するためだけに!
オタクウォーラー

回答:


50

シンボリックリンクは、フルパスまたはリンクへの相対を好む傾向がありますfile-1.txt

移動しproperて実行するls -lと、シンボリックリンクがactual/file-1.txt必要なときに探していることがわかります../actual/file-1.txt

したがって、2つのオプションがあります。

  1. 完全なパスを指定してください

    ln -s ~/actual/file-1.txt ~/actual/file-2.txt ~/proper
  2. リンクを入れたいフォルダーに移動し、そこからリンクします

    cd proper
    ln -s ../actual/file-1.txt ../actual/file-2.txt ./

編集:入力を保存するためのヒント。

あなたはただできる ln -s ~/actual/file-{1,2}.txt ~/proper

中括弧内の項目は置換され、次々に配置され、コマンドを作成します

ln -s ~/actual/file-1.txt ~/actual/file-2.txt ~/proper

これにより、両方のファイルがターゲットディレクトリにリンクされます。シェルをさらに進めていくと、いくつかの大きな入力を節約できます。


2
ありがとう-私はあなたの答えを読む前に髪を引っ張り出そうとしていました。
-orokusaki

1
確かに時々混乱します!Linuxは非常に文字通りである傾向があるため、何かを言うと言うと、そうなります。そのようにフォルダをシンボリックリンクすることに注意してください、私は以前に1つまたは2つ上書きしました(最後のスラッシュなしで名前を指定するだけです)。また、rm -rf *シンボリックリンクされたフォルダーにしないでください-リンク先のフォルダーを消去できます。rm symlinknameを実行するだけです。私がミスを犯したほんの少しのこと–D
nerdwaller

3

問題は、相対パスの使用です。完全な明示パスでリンク作成を指定すると、機能します。

$ ln -s〜/ actual / file1.txt〜/ actual / file2.txt〜/ proper /

$ catproper / file1.txt

ファイル1

$

この例properでは、目的の両方の親ではなく、現在のディレクトリの下にあるactualという名前のサブディレクトリを探すリンクを作成します。


1

シンボリックリンクは注意が必要です。本質的に、シンボリックリンクは、別のファイルのファイル名/パス名を含む(特別な処理のフラグが付けられている)ファイルです。リンクファイルのパス名が ' /'で始まる場合、それは絶対パス名として扱われ、物事はかなり簡単です。スラッシュで始まらない場合は、相対パス名として扱われます(リンクが置かれているディレクトリからの相対パス)。(これは、名前にスラッシュが含まれているかどうかに関係なく当てはまります。)したがって、proper/file–1.txtactual/file–1.txt」へのリンクとして作成し、アクセスしようとすると、システムがアクセスしようとしましたproper/actual/file–1.txt。あなたは言ったはずです

ln s  ../actual/file1.txt  ../actual/file2.txt  proper

ところで、touchコマンドは必要ありませんでした。  echo "file 1" > actual/file–1.txtを作成するには十分actual/file–1.txtです。


0

関連する問題、それは多くの人に明らかかもしれませんが、数分間私を困惑させました:それ自体がシンボリックリンクされているディレクトリ内にシンボリックリンクを作成している場合、または現在の作業ディレクトリのパス内にシンボリックリンクがある場合、あなたはシンボリックリンクが機能しない問題が発生します。

cd ..とをls -l繰り返し使用して、親ディレクトリ自体がシンボリックリンクされているかどうかを確認します。

cd元のターゲットディレクトリへのシンボリックリンクを作成し、そこに新しいシンボリックリンクを作成する必要がある場合は、相対パスが正確になります。

または、別の言い方をすれば、相対パスは、原点からターゲットまでです。その後、Originがシンボリックリンクされる場合、それは問題ありません。しかし、何らかの形でシンボリックリンクされているディレクトリ内に新しいOrigin link_nameを設定する際に問題が発生する可能性があります。


1
代わりに「cd ..ls -l繰り返し」、あなたは使用することができますnamei -mox $PWD。パスに沿ったシンボリックリンクがあるかどうかを調べるための別の有用な方法が使用するpwd -Pすべてのシンボリックリンクが含まれている(その場合はありません、現在のディレクトリにあなたのパスを与える、pwdpwd -P異なる出力を与える、あなたが道に沿ってシンボリックリンクのどこかがあると知っています)。
Ansa211

0

存在しない(またはパスを誤って指定した)ファイルへのリンクを作成しようとすると、ln -sはエラーをスローしません。リンクを作成しますが、そのリンクで「猫」を試みると、ファイルが見つかりませんと表示されます。lsを使用して表示できる場合でも。このような場合は、常にファイルパスを再確認してください。

ubuntu@ip-172-31-80-155:~/lab5$ ln -s etc/ufw/ufw.conf link1
ubuntu@ip-172-31-80-155:~/lab5$ ls -al
total 5360
drwxrwxr-x 2 ubuntu ubuntu    4096 Mar  9 18:56 .
drwxr-xr-x 7 ubuntu ubuntu    4096 Mar  9 18:42 ..
-rwxr--r-- 1 ubuntu ubuntu 5478400 Mar  9 18:32 backup.tar
lrwxrwxrwx 1 ubuntu ubuntu      16 Mar  9 18:56 link1 -> etc/ufw/ufw.conf
ubuntu@ip-172-31-80-155:~/lab5$ cat link1
cat: link1: No such file or directory

ファイルetc / ufw / ufw.confが存在しないためです。正しいパスは/etc/ufw/ufw.confです

ubuntu@ip-172-31-80-155:~/lab5$ ln -s /etc/ufw/ufw.conf link2
ubuntu@ip-172-31-80-155:~/lab5$ ls -l
total 5352
-rwxr--r-- 1 ubuntu ubuntu 5478400 Mar  9 18:32 backup.tar
lrwxrwxrwx 1 ubuntu ubuntu      16 Mar  9 18:56 link1 -> etc/ufw/ufw.conf
lrwxrwxrwx 1 ubuntu ubuntu      17 Mar  9 19:00 link2 -> /etc/ufw/ufw.conf
ubuntu@ip-172-31-80-155:~/lab5$ cat link2
# /etc/ufw/ufw.conf
#

# Set to yes to start on boot. If setting this remotely, be sure to add a rule
# to allow your remote connection before starting ufw. Eg: 'ufw allow 22/tcp'
ENABLED=no

# Please use the 'ufw' command to set the loglevel. Eg: 'ufw logging medium'.
# See 'man ufw' for details.
LOGLEVEL=low

すでにより良い答えがあり、最初の部分は、ln -s「時々」ターゲットの存在をチェックしないというのは間違っています。
RalfFriedl
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.