Sembolik bağlantım neden çalışmıyor?


24

Sembolik bağları daha iyi anlamaya çalışıyorum ... ve fazla şansım yok. Bu, kullanıcı adı / ana bilgisayar değiştiğinde gerçek kabuk çıktım:

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

Sembolik bir bağlantının şeffaf bir şekilde çalışması gerektiğini düşündüm, dosyaya doğrudan erişiyormuşsunuz gibi işaret ettiği dosya üzerinde çalışabileceğinizi düşündüm rm(tabii ki bağlantının nereden kaldırıldığı hariç) ).


Diskiniz nasıl biçimlendirildi? Hangi dosya sistemini kullanıyorsunuz? (FAT sembolik bağlantıları desteklemez, ancak FAT dosya sisteminde oluşturmaya çalışırsanız hata vermelidir.)
Nicole Hamilton

@NicoleHamilton - Bu ext4 (göre df -T) - yukarıdaki sonuç sizin için de garip mi?
orokusaki

@orokusaki Garip değil. Cevabımı aşağıda görebilirsiniz. Sadece bir kafa, onlara kedi kedi dokunmak gerek yok. Hatta var olmalarına gerek yok. Sadece yazarak kurtarmak için!
nerdwaller

Yanıtlar:


50

Sembolik bağlantılar, tam yolları beğenme veya bağlantıya göre olma eğilimindedir, aksi takdirde genellikle file-1.txtyerel olarak arama yapabilirler (garip bir şekilde).

Şuraya gidin properve çalıştırın ls -lve symlink'in actual/file-1.txtne zaman aradığını aradığını görebilirsiniz ../actual/file-1.txt.

Yani iki seçeneğiniz var:

  1. Tam yolu belirtin

    ln -s ~/actual/file-1.txt ~/actual/file-2.txt ~/proper
  2. Bağlantının olmasını istediğiniz klasöre gidin ve oradan bağlantı kurun

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

Düzenle : Yazmayı kaydetmek için bir ipucu.

Sadece yapabilirsin ln -s ~/actual/file-{1,2}.txt ~/proper

Kıvırcık parantez içindeki öğeler değiştirilir ve birbiri ardına yerleştirilir ve komut oluşturulur.

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

her iki dosyayı da hedef dizine bağlar. Kabukta ilerledikçe bazı büyük yazımları kaydeder.


2
Teşekkürler - Cevabınızı okumadan önce saçlarımı çıkarmak üzereydim.
orokusaki

1
Bazen kafa karıştırıcı! Linux çok değişmez olma eğilimindedir, bu yüzden bir şey yap derseniz - olacaktır. Bu şekilde symlinking klasörlerine dikkat edin, daha önce bir veya iki kez üzerine yazdım (Sadece sondaki eğik çizgi olmadan adı belirtin). Ayrıca, rm -rf *sembolik bir klasöre bağlamayın - bağlandığı klasörü silebilirsiniz. Sadece rm symlinkname yapın. Hata yaptığım birkaç şey: D
nerdwaller

3

Sorun göreli yolların kullanılmasıdır. Bağlantı oluşturma işleminizi tam açık yolla belirtirseniz çalışır.

$ ln -s ~ / gerçek / dosya1.txt ~ / gerçek / dosya2.txt ~ / uygun /

$ cat proper / file1.txt

dosya 1

$

Örneğiniz, propero andaki dizinin her ikisinin de ebeveyni yerine geçerli dizinin altında gerçek adında bir alt dizin arar.


1

Sembolik bağlantılar zor olabilir. Temelde, sembolik bir bağlantı başka bir dosya için dosya adı / yol adı içeren (ve özel işlem için işaretlenen) bir dosyadır. Bağlantı dosyasındaki yol adı ' /' ile başlıyorsa , mutlak bir yol adı olarak kabul edilir ve işler oldukça basittir. Eğik çizgi ile başlamazsa, bağlantının bulunduğu dizine göre göreli bir yol adı olarak değerlendirilir. (Bu, adda eğik çizgiler içerip içermediğine bakılmaksızın geçerlidir.) Bu nedenle, proper/file–1.txtactual/file–1.txt” öğesine bir bağlantı olarak oluşturdunuz ve erişmeye çalıştığınızda sistem erişmeye çalıştı proper/actual/file–1.txt. Söylemen gerekirdi

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

Bu arada, touchkomutlara ihtiyacınız yoktu .  echo "file 1" > actual/file–1.txtoluşturmak için yeterlidir actual/file–1.txt.


0

İlgili bir sorun var ve birçok kişi için açık olabilir, ancak birkaç dakika beni güldü: Kendisinin işaretli olduğu bir dizin içinde bir sembolik bağlantı oluşturuyorsanız veya geçerli çalışma dizininin yolunda bir sembolik bağlantı varsa, çalışmayan sembollerle ilgili sorunlara rastlamak.

Üst dizinlerinizin kendilerine sembolik olup olmadığını görmek için cd ..ve tuşlarını ls -ltekrar tekrar kullanın .

cdOrijinal Hedef dizinine bir sembolik bağlantı oluşturmanız ve orada yeni semboller oluşturmanız gerekiyorsa, göreli yollar da doğrudur.

Ya da başka bir deyişle: göreceli yol Kökenden Hedefe doğrudur. Origin daha sonra sembolik bağlanırsa sorun olmaz. Ancak, bir şekilde kendisine bağlanmış bir dizin içinde yeni bir Köken bağlantı_adı kurma sorunlarıyla karşılaşabilirsiniz.


1
Bunun yerine " cd ..ve ls -ltekrar tekrar" kullanabilirsiniz namei -mox $PWD. Yol boyunca sembolik bağlar var olup olmadığını öğrenmek için başka yararlı bir yöntemdir kullanımına ise pwd -Psize eğer öyleyse (herhangi bir sembolik içermiyor geçerli dizinin yolunu veren pwdve pwd -Pcevap farklıdır, yol boyunca sembolik bir yerlerde olduğunu biliyorum ).
Ansa211

0

Varolmayan bir dosyaya bağlantı oluşturmaya çalıştığınızda (veya yolu yanlış verdiğinizde) ln -s hata vermez. Bir bağlantı oluşturur, ancak bu bağlantıda 'kedi' denediğinizde dosya bulunamadı der. Ls kullanarak görebildiğinizde bile. Bu gibi durumlarda dosya yolunuzu her zaman iki kez kontrol edin.

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

Çünkü etc / ufw / ufw.conf dosyası mevcut değil. Doğru yol /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

Zaten daha iyi bir cevap var ve ilk kısım, ln -s"bazen" hedefin varlığını kontrol etmediği yanlıştır.
RalfFriedl
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.