Geçerli dizini değiştirmeden alt dizinlerdeki Symlink diğer ad dosyaları


11

Alt dizinleri taşımadan bir dosyayı bir alt dizinde yeni bir dosyaya bağlamak basit görünecektir .... .... Ancak sözdizimi ile ilgili bir şey şaşırtıcı ve beklediğimden farklı. İşte bir test örneği:

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

Bu sadece kırık bir sembolik oluşturur! Bu bir yapı ortamı kurulum komut dosyasında çalıştırıyorum, bu yüzden mümkünse geçerli çalışma dizini değiştirmekten kaçınmak istiyorum.

ln -s deploy/resources.build.php resources.php
cat deploy/resources.php

Ayrıca, dağıtma alt dizini yerine geçici dizinde symlink oluşturduğundan da çalışmaz.

cd deploy
ln -s resources.build.php resources.php
cd ..

Bu işe yarıyor, ancak dizinleri değiştirmeden nasıl yapılacağını bilmeyi tercih ederim.

Gibi tam bir yol kullanma:

/home/whatever/src/project/temp/stuff/temp/deploy/resources.build.php

Çalışır, ancak tuhaf ve biraz pratik değildir, özellikle tüm proje öğelerinin yapılar ve benzerleri arasında farklı olabileceği bir yapı ortamında.

Bir alt dizindeki iki dosya arasında, o alt dizine girip çıkmadan ve yeni dosyaya "takma ad" a yeni bir ad verirken nasıl bir sembolik bağlantı oluşturabilirim?

Yanıtlar:


10

Ancak sözdizimi ile ilgili bir şey şaşırtıcı ve beklediğimden farklı.

Kullandığınız lnformdaki argümanlar şunlardır:

ln [OPTION] ... [-T] HEDEF LINK_NAME (1. form)

Şaşırtıcı olmayan, sezgisel olmayan şey, bir symlink oluşturduğunuzda, için hedef argümanının lnbir dosya yolu olması değil, oluşturulacak symlink'in içeriği olmasıdır. Bir an için düşünürseniz, bunun böyle olması gerektiği açıktır. Düşünmek:

$ 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

Bu örnekte, aynı dosyaya işaret eden "bar1" ve "bar2" adlı 2 simge oluşturuyorum. lsancak, sembollerin kendilerinin farklı içerikleri olduğunu gösterir - biri mutlak bir yol içerir ve diğeri göreceli bir yol içerir. Bu nedenle, biri başka bir dizine taşınsa bile çalışmaya devam eder ve diğeri olmaz:

$ mv bar2 /tmp
$ cat /tmp/bar2
foo
$ mv bar1 /tmp
$ cat /tmp/bar1
cat: /tmp/bar1: No such file or directory

Bu nedenle, hem göreceli hem de mutlak semboller yapabilmemiz ve hatta hedef dosya daha sonra oluşturulursa kırılacak kırık semboller bile oluşturabilmemiz gerektiğinde, hedef argüman, varolan bir dosyanın yolu.

Deploy / resources.php adlı bir dosyayı deploy / resources.build.php dosyasına bağlayan bir dosya oluşturmak istiyorsanız, mutlak bir symlink oluşturmak isteyip istemediğinize karar vermeniz gerekir. hedef taşınır) veya göreli bir işaret bağlantısı (hem işaret bağlantısı hem de hedef birlikte taşındığı ve aynı göreli yolları koruduğu sürece çalışmaya devam eder).

Mutlak bir sembolik bağlantı oluşturmak için şunları yapabilirsiniz:

$ ln -s $PWD/deploy/resources.build.php deploy/resources.php

Göreli bir tane oluşturmak için, önce kaynaktan hedefe göreli yolu bulursunuz. Bu durumda, kaynak ve hedef birbirine göre aynı dizinde bulunduğundan, şunları yapabilirsiniz:

$ ln -s resources.build.php deploy/resources.php

Aynı dizinde olmasalardı, bunun gibi bir şey yapmanız gerekir:

$ ln -s ../foo/f bar/b

Bu durumda, olsa bile foove barmevcut dizinde hem, bir eklemeniz gerekir vardır ../içine ln hedefe bulmak açıklamaktadır çünkü fiçeren dizinden b.

Bu çok uzun bir açıklama ama umarım lnsentaksı biraz daha iyi anlamanıza yardımcı olur .


3

Bağlantıyı aşağıdaki gibi bir alt kabukta oluşturabilirsiniz:

  (cd deploy && ln -s resources.build.php resources.php && cat resources.php)

Alt kabuk yürütmeyi bitirdiğinde, kendinizi hala doğru dizinde bulacaksınız.

Alternatif olarak,

 ln -s resources.build.php deploy/resources.php

Bu da çalışır, CL'ye kaynaklar.build.php dosyasının komutu verdiğiniz dizinde bulunmadığını, ancak aslında ./deploy'un içinde olduğunu ihmal ederek çalışır .


Bu kara büyü, efendim!
Kzqai

1

Bir symlink temelde bir yapılandırma dosyası olduğunu fark edene kadar bu beni şaşırttı. yani bu yol verilerini basit bir metin dosyasına nasıl yazarım:

ln -s [target] [link name]

dönüşür:

echo [target] > [link name]

Ben (ve muhtemelen OP) yaptığı hata ln hedeflediği dosya hakkında bilmek gerekiyor düşünüyor . ln umursamıyor. Sadece bir dosyaya bazı yol bilgilerini yazmak. Bu son derece makul bir ln komutudur:

ln -s /path/doesnt/exist/file.err
ll
file.err -> /path/doesnt/exist/file.err

Dolayısıyla:

ln -s deploy/resources.build.php deploy/resources.php

adlı bir simlink dosyası üretir resources.phpiçinde ./deploydosya başvuran olur klasöründe resources.build.phpklasöründe ./deploy/deploy/.

İstediğiniz bu değildir ve kötü (bozuk) bir bağlantı verir. Bağlantıda yanlış bir şey yok, o dosyayı oraya koyarsanız bağlantı çalışır. Ancak, (başkaları tarafından işaret edildiği gibi) ben ve OP'nin istediği şey:

ln -s resources.build.php deploy/resources.php
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.