प्रतीकात्मक लिंक कैसे कॉपी करें?


180

मेरे पास निर्देशिका है जिसमें कुछ प्रतीकात्मक लिंक हैं:

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

मुझे उन्हें वर्तमान निर्देशिका में कॉपी करने की आवश्यकता है। परिणामी लिंक उनके प्रोटोटाइप से स्वतंत्र होना चाहिए और सीधे अपने लक्ष्य वस्तुओं तक ले जाना चाहिए।

  • cp -s उन लिंक्स के लिंक बनाता है जो उचित व्यवहार नहीं है।
  • cp -s -L निर्देशिकाओं के लिंक कॉपी करने से इंकार कर दिया
  • cp -s -L -r गैर-कार्यशील निर्देशिका के सापेक्ष लिंक कॉपी करने से इंकार करना

मुझे क्या करना चाहिए?


10
cp -dमेरी तरफ से काम किया।
एम-रिक

2
cp -Rएक मैक पर
मिरको

जवाबों:


201
cp --preserve=links

आदमी पृष्ठ से:

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

व्यक्तिगत रूप से, मैं cp -av अपनी अधिकांश भारी नकल के लिए उपयोग करता हूं। इस तरह, मैं सब कुछ संरक्षित कर सकता हूं - यहां तक ​​कि पुनरावर्ती रूप से - और आउटपुट को देख सकता हूं। बेशक, यह सिर्फ व्यक्तिगत पसंद है।

जैसे कि आपके अन्य विकल्पों ने आपकी अपेक्षा के अनुरूप क्यों नहीं किया, नकल करने के बजाय-s एक लिंक बनाता है और स्रोत में लिंक का अनुसरण करके फाइल को खोजने के लिए लिंक को स्वयं कॉपी करने के बजाय कॉपी करता है।-L


3
आपको जोड़ने की आवश्यकता हो सकती है -R, क्योंकि अन्यथा cp निर्देशिकाओं को छोड़ देगा और निर्देशिकाओं के प्रति सहानुभूति रखेगा।
ओलिवियर 'एल्बाउम' श्लेलर

8
मैं यह redhat पर की कोशिश की और यह काम नहीं करता है
Mansuro

41
एक मैक पर? उपयोगcp -a
स्टीव टाउबर

11
-aविकल्प के लिए +1 । हे, मैंने cpअनगिनत बार अनगिनत विकल्पों में देखा है , फिर भी मुझे इस पर हमेशा ध्यान रखना चाहिए। मैं अब तक उपयोग कर रहा हूं -dpr, लेकिन -aउन सभी को शामिल करता है, साथ ही कुछ अन्य विशेषताओं का संरक्षण भी करता है। अगर मुझे इन अन्य विशेषताओं की आवश्यकता होती है, तो मैंने शायद --preserveविकल्प को फिर से देखा और उपयोग किया -dr --preserve=all, जो कि वास्तव में यही -aहै! खैर कम से कम मुझे अब पता है - -aएकदम सही है और यही वह है जिसका मैं अभी से उपयोग करूंगा।
जेम्स हाई

3
यह Cygwin पर काम नहीं किया। --preserve=linksपर्याप्त नहीं था। इसने फिर भी कहा cp: omitting directory। लेकिन -avकाम किया।
च्लोए

44

जिस प्रकार मैन पेज कहता है, उपयोग करें -P


8
मैक -Pपर निर्देशिकाओं पर काम नहीं करता है इसलिए मैंने इस्तेमाल कियाcp -a
स्टीव टाबर

4
धन्यवाद, मैंने देखा है और एक साल में 3 बार अब अलग-अलग आपके उत्तर से लाभान्वित हुआ है। यह याद करने के लिए प्रतीत नहीं कर सकते!
सिद्धार्थ

यह काम करता है, लेकिन मेरा मैन पेज कहता है कि "SO SOCE में कभी भी प्रतीकात्मक लिंक का पालन नहीं करता है", जो कि सहज रूप से "गंतव्य के लिए सहानुभूति के रूप में कॉपी सहानुभूति" के समान नहीं है। ("कभी भी पालन नहीं करता है" यह आवाज करता है जैसे -R के साथ संयोजन में काम करता है)
आरएम

यह cp -Pमेरे लिए @kainosnous कार्यों द्वारा शीर्ष मतदान जवाब के विपरीत है। धन्यवाद!
tommy.carstensen

रेडहैट पर काम करता है। स्वीकृत प्रतिक्रिया काम नहीं करती!
फीबेर

29

यदि लिंक में सापेक्ष पथ हैं, तो, लिंक की प्रतिलिपि बनाने से सापेक्ष पथ समायोजित नहीं होगा। लिंक का निरपेक्ष पथ प्राप्त करने के लिए, पुनरावृत्ति का अनुसरण करने के readlinkलिए स्विच के साथ उपयोग करें -f। उदाहरण के लिए:

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

यदि इग्नासियो वाज़केज़-अब्राम्स द्वारा कहा गया है, के विकल्प -Pकी तुलना में आप जो चाहते हैं, उसके सापेक्ष रास्तों का संरक्षण करना cpहै।


1
यदि आप सब करने की कोशिश कर रहे हैं तो यह एक बुरा विचार हो सकता है कि आप अपने साथी को पूर्ण से सापेक्ष होने में परिवर्तित करें। यहां पुनरावृत्ति की आवश्यकता नहीं है, और कभी-कभी एक कारण के लिए जंजीरों वाले सीमलिंक होते हैं। विकल्प या कॉन्फ़िगरेशन विकल्पों को निर्दिष्ट करने के लिए अक्सर साइमलिंक का उपयोग किया जाता है। उदाहरण के लिए, मेरे सिस्टम पर एक सिमिलिंक श्रृंखला है /usr/share/dict/words -> /etc/dictionaries-common/words -> /usr/share/dict/british-englishजो पसंदीदा शब्दकोश को निर्दिष्ट करती है। यदि आप इस श्रृंखला को पुनरावृत्ति से हटा रहे थे, तो परिणामी सिमिलिंक भविष्य की किसी भी पसंद को इस वरीयता में बदल देगा।
जेम्स हाई

24

जैसा कि कुछ ने टिप्पणी की है:

cp -a 

अच्छा काम करता है।

आदमी से:

-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
... लेकिन केवल अगर कोई भी सहानुभूति रिश्तेदार पथ के लिए नहीं है।
माइकल शेपर

11

मैं एक बहुत बड़ी निर्देशिका की नकल करने के लिए निम्नलिखित का उपयोग करता था। सभी प्रतीकात्मक लिंक संरक्षित थे, प्रतिलिपि पुनरावर्ती रूप से की गई थी और मैं इस प्रक्रिया की कुछ दृश्य प्रतिक्रिया करने में सक्षम था:

cp -Prv /sourcer_dir/* /target_dir

10

अधिकांश समय, जब मुझे कई प्रतीकात्मक लिंक कॉपी करने की आवश्यकता होती है, मैं वास्तव में एक निर्देशिका पेड़ को दर्पण करने की कोशिश कर रहा हूं। इसलिए मुझे सहानुभूति और बाकी सब कुछ चाहिए।

यह केवल कुछ सिम्लिंक की नकल करने के लिए ओवरकिल है, लेकिन अगर आप वास्तव में एक पूरे पेड़ की नकल करने की कोशिश कर रहे हैं, तो यह बहुत उपयोगी हो सकता है:

टार का उपयोग करें ।

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

टार डिफ़ॉल्ट रूप से सिम्लिंक को हल नहीं करता है, इसलिए मिरर कॉपी में सिमिलिंक मूल स्थानों के समान स्थानों को इंगित करेगा।

इस चाल से उपधाराओं का उपयोग टार कमांड को स्थिति के मूल में स्थिति में लाने के लिए किया जाता है; यदि आप पहले से ही src या भाग्य निर्देशिका में हैं, तो आप उनमें से एक को (संबंधित cd कमांड के साथ) छोड़ सकते हैं :

# 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 - )'

फिर, यह हर बार जब आप प्रतीकात्मक लिंक कॉपी करना चाहते हैं, तो यह उचित नहीं है, लेकिन यह जानना बहुत उपयोगी स्निपेट है।


1
मेरे अनुभव में टार निश्चित रूप से cp से अधिक पोर्टेबल है
चमकीले

4

आज़माएँ: cp -pr symlink डेस्टिनेशन

[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]# 

ओएस - सेंटोस 5 (लिनक्स)


3

एक निर्देशिका में लिंक और फ़ाइलों की नकल करते समय उबंटू पर:

cp --no-dereference --preserve=links

5
cp -dइस के लिए आशुलिपि है
hunse

1
मुझे लगता है कि दोनों cp -aऔर cp --preserve=linksसवाल पूछने से ज्यादा करते हैं। जैसा कि मैं इसे समझता हूं, यह किसी का भी उपयोग करने के लिए सही उत्तर है cp, हालाँकि प्रश्न में केवल फाइलों (कोई निर्देशिका) के साथ, --no-dereferenceकोई प्रभाव नहीं होगा।
पलसीम

2

-Pविकल्प का उपयोग करें , जैसा कि इग्नासियो वाज़केज़-अब्राम्स ने ऊपर लिखा है । उन्होंने जो उल्लेख नहीं किया -Pउसका कोई प्रभाव नहीं है -R। इसलिए आपको कम से कम चाहिए cp -RP

(साइट ने मुझे अभी तक टिप्पणी करने की अनुमति नहीं दी है इसलिए मैंने एक अलग उत्तर पोस्ट किया है।)


एक पुराने सोलारिस बॉक्स पर मेरा cp समर्थन -d नहीं करता है। cp -rP ने मेरे लिए काम किया; (मेरे बीच -R और -r, -r काम करता है के बीच अंतर आईडी)।
दंगाई

1

cp -s और cp -L विशेष कमांड हैं। अपनी आवश्यकता के लिए, कोई भी उपयोग न करें।

उदाहरण के लिए एक निर्देशिका की प्रतिलिपि बनाना, जिसमें एक और एक प्रतीकात्मक लिंक है, जो एक ओर इशारा करता है।

  • cp -s DIR / * N / कॉपी करने के बजाय एक प्रतीकात्मक लिंक बनाता है, N / a -> .. / DIR / a (लिंक) और N / b -> (../ DIR / b) जो किसी लिंक से लिंक होता है
  • cp -L DIR / * N / कॉपियों के साथ लिंक dereferencing, N / a, N / b (D / D के समान)

आपको क्या चाहिए एन / ए (= डीआईआर / ए), और एन / बी -> ../ एन / ए; तो बस dereferencing के बिना प्रतिलिपि, cp -P विकल्प का उपयोग कर। मेरा मानना ​​है कि यह cp के लिए भी डिफ़ॉल्ट है।

  • -पी-डीरेफेरेंस, लिंक्स को संरक्षित करें
  • -d जोड़ती है-पी के साथ -p = मोड, स्वामित्व, टाइमस्टैम्प को संरक्षित करने के लिए विकल्प
  • -R के साथ -d विकल्प को -R के साथ पुनरावर्ती निर्देशिकाओं की प्रतिलिपि बनाएँ

देखें man cpया cp --helpअधिक विकल्पों के लिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.