
في هذه المقالة ، سيتم الكشف عن بعض الأشياء غير الواضحة المتعلقة باستخدام
أحرف البدل عند النسخ ، وسيتم الكشف عن السلوك الغامض للأمر
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. أنا زيادة الكرمة لهذا الغرض.
