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.