سؤال كيفية نسخ الروابط الرمزية؟


لدي دليل يحتوي على بعض الروابط الرمزية:

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 يرفض نسخ الارتباطات النسبية إلى دليل غير العمل

ماذا يجب أن أفعل؟


156
2018-05-07 04:36


الأصل


cp -d جعل المهمة على جانبي. - m-ric
cp -R على ماك - Mirko


الأجوبة:


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 يتبع الارتباطات الموجودة في المصدر للعثور على الملف الذي سيتم نسخه بدلاً من نسخ الارتباطات نفسها.


174
2018-05-07 05:02



قد تحتاج إلى إضافة -R، لأن cp خلاف ذلك سوف تخطي الدلائل والارتباطات إلى الدلائل. - Olivier 'Ölbaum' Scherler
جربت هذا على ريدهات وهو لا يعمل - Mansuro
على ماك؟ استعمال cp -a - Steve Tauber
+1 لل -a اختيار. هيه ، لقد بحثت عن خيارات في cpلم تكن هناك الكثير من الأوقات ، ولكن لا بد لي من دسم على هذا. لدي حتى الآن تستخدم -dpr، لكن -a يغطي كل ذلك ، بالإضافة إلى الحفاظ على اثنين من الصفات الأخرى. إذا كنت بحاجة إلى هذه السمات الأخرى ربما كنت قد بحثت عن --preserve الخيار مرة أخرى واستخدامها -dr --preserve=allوهو بالضبط ما -a هو! حسنا على الأقل أنا أعلم الآن - -a هو مثالي وهذا ما سأستخدمه من الآن فصاعدا. - James Haigh
هذا لم يعمل على Cygwin. --preserve=links لم يكن كافيًا ما زال قال cp: omitting directory. لكن -av عمل. - Chloe


مثلما تقول صفحة الرجل ، استخدم -P.


34
2018-05-07 04:39



على ماك -P لا يعمل على الدلائل لذلك اعتدت cp -a - Steve Tauber
شكرا ، لقد رأيت واستفادت من إجابتك 3 مرات الآن مرات مختلفة على مدار السنة. لا يبدو أن نتذكر ذلك! - Siddhartha
هذا يعمل ، لكن صفحة رجلتي تقول "-P لا تتبع الروابط الرمزية في SOURCE" ، وهي ليست بديهية مثل "نسخ symlinks كتربطات للوجهة". ("لا تتبع أبدا" يجعل الأمر يبدو وكأنه يعمل في تركيبة مع -R) - R.M.
هذه cp -P على عكس أعلى الأصوات صوت من قبل @ kainosnous يعمل بالنسبة لي. شكر! - tommy.carstensen
يعمل على Redhat. الاستجابة المقبولة لا تعمل! - Phiber


إذا كانت الروابط تحتوي على مسارات نسبيًا ، فلن يؤدي نسخ الرابط إلى ضبط المسار النسبي. استعمال readlinkمع التبديل -f لمتابعة متكرر ، من أجل الحصول على المسار المطلق للارتباط. فمثلا:

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

إذا كان الحفاظ على المسارات النسبية هو ما تريده ، من الخيار -P من cpكما قال Ignacio Vazquez-Abrams ، هو ما تحتاجه.


26
2018-05-07 05:09



قد تكون فكرة سيئة للتكرار بشكل سيئ إذا كان كل ما تحاول القيام به هو تحويل symlinks من كونها نسبة إلى مطلق. ليست هناك حاجة إلى التكرار هنا ، وأحيانًا تكون هناك روابط رمزية مقفلة لسبب ما. غالبًا ما يتم استخدام Symlinks لتحديد الخيارات أو خيارات التهيئة. على سبيل المثال ، يوجد على نظام بلدي سلسلة الارتباط /usr/share/dict/words -> /etc/dictionaries-common/words -> /usr/share/dict/british-english الذي يحدد القاموس المفضل. إذا كنت ستقوم بالتعديل بشكل متكرر على هذه السلسلة ، فستتجاهل الشفرة الناتجة أي تغييرات مستقبلية لهذا التفضيل. - James Haigh


كما علق عدد قليل:

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

19
2018-01-27 14:51



... ولكن فقط في حالة عدم وجود أي من الروابط الرمزية في المسارات النسبية. - Michael Scheper


لقد استخدمت ما يلي لتكرار دليل كبير بالفعل. تم الحفاظ على جميع الروابط الرمزية ، وتم نسخها بشكل متكرر وكنت قادراً على الحصول على بعض الملاحظات المرئية لهذه العملية:

cp -Prv /sourcer_dir/* /target_dir

9
2018-05-15 17:25





في أغلب الأحيان ، عندما أحتاج إلى نسخ العديد من الروابط الرمزية ، أحاول فعليًا نسخ شجرة دليل. لذلك أريد الروابط الرمزية وكل شيء آخر.

يعد هذا أمرًا مبالغة لنسخ بعض الروابط فقط ، ولكن إذا كنت تحاول بالفعل نسخ شجرة كاملة ، فقد يكون هذا مفيدًا جدًا:

استعمال قطران.

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

قطران لا يحل الارتباط الرمزي بشكل افتراضي ، لذلك فإن الروابط الرمزية في نسخة النسخة المتطابقة ستشير إلى المواقع نفسها كتلك الموجودة في الشجرة الأصلية.

هذه الخدعة يجعل استخدام subshells للحصول على قطران الأمر في الموضع في جذر الدليل المراد نسخها ؛ يمكنك ترك واحد منهم (جنبا إلى جنب مع المقترن القرص المضغوط الأمر) إذا كنت بالفعل في SRC أو دست الدلائل:

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

مرة أخرى ، هذا غير مناسب لكل مرة تريد فيها نسخ روابط رمزية ، ولكنه مقتطف مفيد للغاية يجب معرفته.


8
2018-05-07 06:03



القطران هو بالتأكيد أكثر المحمولة من الحزب الوطني في تجربتي - don bright


محاولة: cp -pr وجهة رمزية

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

نظام التشغيل - Centos 5 (Linux)


3
2017-07-27 13:15





على Ubuntu عند نسخ الروابط والملفات في الدليل:

cp --no-dereference --preserve=links

1
2017-12-01 12:51



cp -d هو الاختزال لهذا - hunse


cp -s و cp -L هي أوامر خاصة. للاحتياجات الخاصة بك ، استخدم لا شيء.

مثلا نسخ دليل DIR يحتوي على رابط ورمز b يشير إلى.

  • cp -s DIR / * N / ينشئ رابطًا رمزيًا بدلاً من النسخ ، N / a -> ../ DIR / a (رابط) و N / b -> (../ DIR / b) وهو رابط إلى رابط
  • cp -L DIR / * N / نسخ مع إلغاء الربط ، N / a ، N / b (مثل DIR / a)

ما تحتاجه هو N / a (= DIR / a) و N / b -> ../ N / a؛ حتى مجرد نسخ دون dereferencing ، وذلك باستخدام الخيار CP -P. وأعتقد أن هذا هو أيضا الافتراضي ل cp.

  • -P عدم الانحراف ، والحفاظ على الروابط
  • -d يجمع بين -P الخيار مع -p للحفاظ على = الوضع ، والملكية ، والطوابع الزمنية
  • يجمع بين -d الخيار مع -R إلى نسخ الدلائل بشكل متكرر

أشير man cp أو cp --help لمزيد من الخيارات.


0
2018-06-26 03:24