Sembolik linkler nasıl kopyalanır?


180

Bazı sembolik bağlar içeren bir dizine sahibim:

user@host:include$ find .. -type l -ls
4737414    0 lrwxrwxrwx   1 user group       13 Dec  9 13:47 ../k0607-lsi6/camac -> ../../include
4737415    0 lrwxrwxrwx   1 user group       14 Dec  9 13:49 ../k0607-lsi6/linux -> ../../../linux
4737417    0 lrwxrwxrwx   1 user group       12 Dec  9 13:57 ../k0607-lsi6/dfc -> ../../../dfc
4737419    0 lrwxrwxrwx   1 user group       17 Dec  9 13:57 ../k0607-lsi6/dfcommon -> ../../../dfcommon
4737420    0 lrwxrwxrwx   1 user group       19 Dec  9 13:57 ../k0607-lsi6/dfcommonxx -> ../../../dfcommonxx
4737421    0 lrwxrwxrwx   1 user group       17 Dec  9 13:57 ../k0607-lsi6/dfcompat -> ../../../dfcompat

Onları geçerli dizine kopyalamam gerekiyor. Sonuçta ortaya çıkan bağlantılar prototiplerinden bağımsız olmalı ve doğrudan hedef nesnelerine yönlendirilmelidir.

  • cp -s uygun davranış olmayan linklere linkler oluşturur.
  • cp -s -L dizinlere link kopyalamayı reddediyor
  • cp -s -L -r çalışmayan dizine göreceli bağlantıları kopyalamayı reddediyor

Ne yapmalıyım?


10
cp -dişi yanımda yaptım.
m-ric

2
cp -Rbir mac üzerinde
Mirko

Yanıtlar:


201
cp --preserve=links

Man sayfasından:

   --preserve[=ATTR_LIST]
          preserve  the   specified   attributes   (default:   mode,owner-
          ship,timestamps),  if  possible  additional attributes: context,
          links, xattr, all

Şahsen, cp -av ağır kopyalarımın çoğunda kullanıyorum . Bu şekilde her şeyi - özyinelemeyle bile - koruyabilir ve çıktıları görebilirim. Tabii ki, bu sadece kişisel bir tercih.

Diğer seçenekleriniz neden istediğiniz şeyi yapmadıysa , kopyalamak yerine-s bir bağlantı oluşturur ve bağlantıları kopyalamak yerine kopyalanacak dosyayı bulmak için kaynaktaki bağlantıları izler.-L


3
Eklemeniz gerekebilir -R, çünkü aksi halde cp dizinleri atlayacak ve dizinlere bağlayacak.
Olivier 'Ölbaum' Scherler

8
Bunu redhat üzerinde denedim ve işe yaramadı
Mansuro

41
Mac’te mi? kullanıncp -a
Steve Tauber

11
-aSeçenek için +1 . Heh, cpsayısız zamanlar sayfasındaki seçeneklere baktım , ama her zaman bunun üzerinde durmuş olmalıyım. Ben şimdiye kadar kullanıyorum -dpr, ancak -ahepsini, ayrıca birkaç başka özelliği de korudum. Bu diğer özelliklere ihtiyacım olsaydı, muhtemelen --preserveseçeneği tekrar aradım ve kullandım -dr --preserve=all, bu tam olarak ne -a! En azından şimdi biliyorum - -amükemmel ve bundan sonra kullanacağım şey bu.
James Haigh

3
Bu Cygwin'de işe yaramadı. --preserve=linksyeterli değildi. Yine de söyledi cp: omitting directory. Fakat -avçalıştı.
Chloe,

44

Adam sayfasının dediği gibi, kullan -P.


8
Mac'te -Pdizinlerde çalışmadığı için kullandımcp -a
Steve Tauber

4
Teşekkürler, cevabınızdan yılda 3 kez farklı zamanlarda şimdiye kadar 3 kez gördüm ve fayda sağladım. Hatırlamıyor görünmüyor!
Siddhartha

Bu işe yarıyor, fakat adam sayfam "-P SOURCE içindeki sembolik bağları asla takip etmiyor" diyor, "sezgisel olarak" hedeflere sembolik olarak sembolik bağlantıları kopyala "ile aynı değildir. ("asla takip etme", -R ile birlikte çalıştığı gibi ses çıkarır)
RM

Bu cp -P, @kainosnous'un benim için çalıştığı tepedeki oyların aksine. Teşekkürler!
tommy.carstensen

Redhat üzerinde çalışıyor. Kabul edilen cevap işe yaramadı!
Phiber

29

Bağlantılar göreceli yollar içeriyorsa, bağlantının kopyalanması göreceli yolu ayarlamaz. Kullanım readlinkanahtarı ile, -fbağlantının mutlak yolunu almak için, yinelemeli takip etmek. Örneğin:

ln -s $(readlink -f old/dir/oldlink) new/dir/newlink

Göreli yollar koruyarak size seçenek daha istediğiniz buysa -Pait cpolarak Ignacio Vazquez-Abrams tarafından dedi, ne ihtiyaç vardır.


1
Yapmaya çalıştığınız tek şey, sembolik bağları mutlak göreceli hale dönüştürmek ise, özyinelemeyle kurallara uymamak kötü bir fikir olabilir. Özyineleme burada gerekli değildir ve bazen zincirlenmiş sembolik bağlar bir sebep için oradadır. Sembolik bağlantılar genellikle seçimleri veya yapılandırma seçeneklerini belirtmek için kullanılır. Örneğin, sistemimde /usr/share/dict/words -> /etc/dictionaries-common/words -> /usr/share/dict/british-englishtercih edilen sözlüğü belirten bir sembol zinciri var. Eğer tekrar tekrar bu zinciri serbest bırakacak olsaydınız, ortaya çıkan sembolik link bu tercihte yapılacak değişiklikleri görmezden gelir.
James Haigh

24

Birkaç yorumladı:

cp -a 

iyi çalışıyor.

Adamdan:

-a    same as -dR --preserve=all

-R    copy directories recursively
-d    same as --no-dereference --preserve=links
--no-dereference   never follow symbolic links in SOURCE

3
... ancak sadece sembolik bağların hiçbiri göreceli yollarda değilse.
Michael Scheper,

11

Aşağıdakileri gerçekten büyük bir dizini kopyalamak için kullandım. Tüm sembolik bağlar korunmuş, kopya tekrarlı bir şekilde yapılmış ve işlem hakkında görsel geri bildirim alabildim:

cp -Prv /sourcer_dir/* /target_dir

10

Çoğu zaman, birçok sembolik bağı kopyalamam gerektiğinde, aslında bir dizin ağacını yansıtmaya çalışıyorum. Bu yüzden sembolik bağları ve diğer her şeyi istiyorum.

Bu, sadece birkaç sembolik kopyasını kopyalamak için çok önemlidir, ancak aslında bir ağacın tamamını kopyalamaya çalışıyorsanız, bu çok faydalı olabilir:

Tar kullanın .

user@host:/cwd$ ( cd /path/to/src ; tar cf - . ) | ( cd /path/to/dest ; tar xf - )

tar , sembolik bağlantıyı varsayılan olarak çözmez, bu nedenle yansıtma kopyasındaki sembolik bağlantılar orijinal ağaçtakilerle aynı konumlara işaret eder.

Bu numara, tar komutunu yansıtılacak dizinin kökündeki konumuna getirmek için alt kabuklardan yararlanır ; src veya dest dizinlerinde iseniz , bunlardan birini (ilişkili cd komutuyla birlikte) dışarıda bırakabilirsiniz :

# already in src?
user@host:/src$ tar cf - . | ( cd /path/to/dest ; tar xf - )

# already in dest?
user@host:/dest$ ( cd /path/to/src ; tar cf - . ) | tar xf - 

# just need src/foo?
# this result will be a mirror copy at dest/foo 
user@host:/src$ tar cf - foo | ( cd /path/to/dest ; tar xf - )

# mirror to another system?
user@host:/src$ tar cf - . | ssh user@example.com '( cd /path/to/dest ; tar xf - )'

Yine, bu sembolik bağları kopyalamak istediğiniz her zaman için uygun değildir, ancak bunu bilmek çok yararlı bir snippet'tir.


1
katran kesinlikle benim deneyim cp daha taşınabilir
don parlak

4

Deneyin: cp -pr bağlantı noktası hedefi

[root@station1 temp]# ls -l
total 8
-rw-r--r-- 1 root root  0 Jul 27 18:40 abc
lrwxrwxrwx 1 root root 13 Jul 27 18:41 abc.link1 -> /tmp/temp/abc
[root@station1 temp]# cp -rp /tmp/temp/abc.link1 /tmp/temp/abc.link2
[root@station1 temp]# ls -l
total 12
-rw-r--r-- 1 root root  0 Jul 27 18:40 abc
lrwxrwxrwx 1 root root 13 Jul 27 18:41 abc.link1 -> /tmp/temp/abc
lrwxrwxrwx 1 root root 13 Jul 27 18:42 abc.link2 -> /tmp/temp/abc
[root@station1 temp]# 

İşletim Sistemi - Centos 5 (Linux)


3

Bir dizindeki bağlantıları ve dosyaları kopyalarken Ubuntu'da:

cp --no-dereference --preserve=links

5
cp -dbunun için steno
hunse,

1
Her ikisini de düşünüyorum cp -ave cp --preserve=linkssorunun sorduğundan fazlasını yapın. Anladığım kadarıyla, bu soru kullanan herkes için doğru cevap cp, ancak sadece dosyalarda (dizin yok), soruda olduğu gibi --no-dereferenceetkisi olmaz.
palswim

2

-PIgnacio Vazquez-Abrams'ın yukarıda yazdığı gibi seçeneği kullanın . Bahsetmediği şey -Polmadan etkisi olmaz -R. Yani en azından ihtiyacınız var cp -RP.

(Site henüz yorum yapmama izin vermiyor, bu yüzden ayrı bir yanıt gönderdim.)


Eski bir solar kutuda cp desteklemiyor -d. cp -rP benim için çalıştı; (idk -R ve -r arasındaki fark, -r benim için çalışıyor).
spioter

1

cp -s ve cp -L özel komutlardır. Gereksiniminiz için hiçbiri kullanın.

örneğin a ile işaret eden sembolik bir bağ b içeren bir DIR dizininin kopyalanması.

  • cp -s DIR / * N / kopyalamak yerine sembolik bir bağ oluşturur, N / a -> ../ DIR / a (link) ve N / b -> (../ DIR / b) link
  • cp -L DIR / * N / a bağlantı başvuru, N / a, N / b (DIR / a ile aynı) kopyalar

İhtiyacınız olan şey N / a (= DIR / a) ve N / b -> ../ N / a; bu yüzden sadece cp -P seçeneğini kullanarak kayıttan çıkarmadan kopyalayın. Bunun cp için de varsayılan olduğuna inanıyorum.

  • -P hakaret yok, bağlantıları koru
  • -d = p, -p seçeneğini -p ile korur = mod, sahiplik, zaman damgaları
  • -a dizinleri art arda kopyalamak için -d seçeneğini -R ile birleştirir

daha fazla seçenek için man cpveya bakın cp --help.

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.