Bir dizindeki tüm dosyalara (dosya sınıfı) sembolik bağlantılar nasıl oluşturulur?


43

Belirli bir dizindeki ln -stüm dosyalara (veya bir dosya sınıfı, örneğin biten) sembolik bağlantılar ( ) oluşturmak istiyorum .bar. Cwd olduğumu ve tipimin ls ../source/*.barbana verdiğini söyle

foo.bar
baz.bar

Parametre listesini ln -snihayetinde çözdüğü şekilde nasıl aktarabilirim?

ln -s ../source/foo.bar
ln -s ../source/baz.bar

Tabii ki bir bash betiği yazabileceğimi biliyorum, ancak xargsortak bir görev gibi gözüktüğü için daha basit bir şeyler olmalı - en azından benim için.

Yanıtlar:


75

ln Birden fazla argüman alıyor, ancak bu durumda bir hedef dizin vermeyi unutmayın.

Yani, örneğin ., hedef dizin, bu kadar kolay olmalı

ln -s ../source/*.bar .

Kimden man ln; Yukarıdaki komut 3. formu kullanır:

ln [OPTION]... [-T] TARGET LINK_NAME   (1st form)
ln [OPTION]... TARGET                  (2nd form)
ln [OPTION]... TARGET... DIRECTORY     (3rd form)
ln [OPTION]... -t DIRECTORY TARGET...  (4th form)
  • 1. formda, LINK_NAME adında TARGET'e bir bağlantı oluşturun.
  • 2. formda, geçerli dizinde TARGET'e bir bağlantı oluşturun.
  • 3. ve 4. formlarda, MÜDÜRLÜĞE her HEDEFE bağlantılar oluşturun.

5
Hayatımın 5 dakikasını kurtardın, bir tanesini yorum yapmak için harcayacak kadar. :-)
moodboom

Dosya yoksa bu işe yaramaz *.bar. İstediğiniz "*.bar"şey değil , adında bir bağlantı oluşturacaktır .
Nimrod

1
@Nimrod: Bu doğru, ama sen söyleyebilir bash bunu aracılığıyla yerine hata bildirmek istiyorum shopt -s failglob; bkz. örneğin, unix.stackexchange.com/a/216227/33390 ( zsh cinsinden eşdeğeri, setopt nomatchvarsayılan olarak açıktır)
mpy

: alkışlar: güzel!
Chris Schmitz

3

kullanım find

certainDir="/path/to/dir"
find -name "*.bar" -exec ln -s {} "$certainDir" \;

Ayrıca, (mümkün olduğunda) tam yolları sembolik bağlantılarla kullanmayı unutmayın .


2
Teşekkürler ama değil mi find $certainDir -name "*.bar" -exec ln -s {} \;? Ve neden tam yolları kullanmalıyım? Wihch etrafında bazı iç bağlantılar vardır bir dizin ağacını hareket ettirdiğimde bağlantıların sağlam kaldığını bilmek oldukça uygun buluyorum.
dastrobu

Bu, dizinleri nereye bağlamak istediğinize bağlıdır. Ve neden tam yolların iyi bir fikir olduğunu hatırlayamıyorum, zor bağlantılar için olabilirdi, ama bir sebepten dolayı bunu aklıma yaktım. Hmmm.
sadece

Teşekkürler, cevabınız harika. Mpy'nin cevabı soruya daha basit bir çözüm olduğundan, mesele ona gider. Yapabilseydim her iki cevabı da kabul ederdim.
dastrobu

3

Globstar kullanarak tekrar tekrar deneyebilirsiniz (bash / zsh by:) shopt -s globstar:

ls -vs ../**/*.bar .

Not: -vAyrıntılı için eklendi .

Veya liste çok uzunsa, findyardımcı programı kullanarak :

find .. -name \*.bar -exec ln -vs "{}" dest/ ';'

Bu, içinde linkler oluşturacak dest/veya .mevcut klasör için onu değiştirecektir .


İkincisi doğru cevap.
Nimrod

0

cp-sseçeneği ile yumuşak bağlantılar oluşturabilir (veya -lsabit bağlantılar için).

Geçerli dizinden bu şekilde kullanılabilir:

$ cp -s ../path/with/scripts/* .

Senin durumunda böyle olacak:

$ cp -s ../source/*.bar .
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.