أمر Cp: نسخ مجلدات الملفات إلى * لا شيء بشكل صحيح



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

افترض أننا بحاجة إلى نسخ كل شيء من المجلد / source إلى المجلد / target.

أول ما يتبادر إلى الذهن هو:

 cp /source/* /target 

إصلاح هذا الأمر على الفور إلى:

 cp -a /source/* /target 

سيضيف -a التبديل -a نسخة من جميع الخصائص والحقوق وإضافة العودية. عندما لا يكون الاستنساخ الدقيق للحقوق مطلوبًا ، يكون المفتاح - -r كافيًا.

بعد النسخ ، وجدنا أنه لم يتم نسخ جميع الملفات - تم تجاهل الملفات التي تبدأ من نقطة مثل:

.profile
.local
.mc

وما شابه ذلك.

لماذا حدث هذا؟

لأن أحرف البدل تعالج القشرة ( bash في حالة نموذجية). بشكل افتراضي ، سيتجاهل bash جميع الملفات التي تبدأ بفترات ، لأنه يعاملها على أنها مخفية. لتجنب هذا السلوك ، يتعين علينا تغيير سلوك bash باستخدام الأمر:

 shopt -s dotglob 

لحفظ هذا التغيير في السلوك بعد إعادة التشغيل ، يمكنك إنشاء ملف wildcard.sh باستخدام هذا الأمر في مجلد /etc/profile.d (قد يكون للتوزيع الخاص بك مجلد مختلف).

وإذا لم تكن هناك ملفات في الدليل المصدر ، فلن تتمكن shell من استبدال أي شيء بالنجمة ، وستفشل عملية النسخ أيضًا. مقابل هذا الموقف ، هناك nullglob و nullglob . نحتاج إلى تعيين failglob ، مما سيمنع تنفيذ الأمر. لن يعمل nullglob ، لأنه يحول سلسلة nullglob البدل التي لم يتم العثور على تطابقات في سلسلة فارغة (بطول صفري) ، مما يؤدي إلى حدوث خطأ في cp .

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

 cp -a /souce/a /source/b /source/c …… /target 

هناك قيود على طول سطر الأوامر ، حيث يمكننا معرفة ذلك باستخدام الأمر:

 getconf ARG_MAX 

الحصول على الحد الأقصى لطول سطر الأوامر بالبايت:

 2097152 

أو:

 xargs --show-limits 

نحصل على شيء مثل:

 …. Maximum length of command we could actually use: 2089314 …. 

لذلك ، دعونا نفعل من دون أحرف البدل على الإطلاق.

دعنا فقط اكتب

 cp -a /source /target 

وهنا سنواجه غموض سلوك cp . إذا كان المجلد / الهدف غير موجود ، فسنحصل على ما نحتاج إليه.

ومع ذلك ، في حالة وجود المجلد الهدف ، سيتم نسخ الملفات إلى المجلد / target / source.

لا يمكننا دائمًا حذف المجلد / الهدف مسبقًا ، لأنه قد يحتوي على الملفات التي نحتاجها وهدفنا ، على سبيل المثال ، هو إضافة ملفات إلى / هدف مع ملفات من / المصدر.

إذا تم تسمية المجلدات المصدر والوجهة بنفس الطريقة ، على سبيل المثال ، فسننسخ من / source إلى / home / source ، فيمكننا استخدام الأمر:

 cp -a /source /home 

وبعد نسخ الملفات في / home / source ستكون الملفات المكملة من / source.

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

للتغلب على هذا القيد الضار ، نستخدم حلاً غير واضح:

 cp -a /source/. /target 

أولئك الذين يعرفون جيدًا DOS و Linux فهموا كل شيء بالفعل: يوجد داخل كل مجلد مجلدين غير مرئيين "." و ".." ، وهما روابط المجلدات الزائفة إلى الدلائل الحالية والعالية.

  • عند النسخ ، يتحقق cp وجوده ويحاول إنشاء / الهدف /.
  • يوجد مثل هذا الدليل وهو / الهدف
  • نسخ الملفات من / المصدر إلى / الهدف بشكل صحيح.

لذلك ، نحن نعلق في إطار غامق في ذاكرتنا أو على الحائط:

 cp -a /source/. /target 

سلوك هذا الأمر لا لبس فيه. كل شيء سوف يعمل دون أخطاء ، بغض النظر عما إذا كان لديك مليون ملف أو لا شيء على الإطلاق.

النتائج


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

خاتمة


اقترح vmspike متغير مشابه للأمر:

 cp -a -T /source /target 

Oz_Alex
 cp -aT /source /target 

تنبيه: حالة الرسالة T الأمور. إذا قمت بخلطها ، ستحصل على القمامة الكاملة: سيتغير اتجاه النسخ.

الشكر:

  • شركة RUVDS.COM لدعمها وفرصة للنشر على مدونتها على Habré.
  • لكل صورة TripletConcept . الصورة كبيرة جدًا ومفصلة ، يمكنك فتحها في نافذة منفصلة.

PS الأخطاء المباشرة التي تلاحظها في PM. أنا زيادة الكرمة لهذا الغرض.



Source: https://habr.com/ru/post/ar471092/


All Articles