أمر cp: نسخ مجلدات الملفات بشكل صحيح في *nix

أمر cp: نسخ مجلدات الملفات بشكل صحيح في *nix

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

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

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

cp /source/* /target

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

cp -a /source/* /target

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

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

.profile
.local
.mc

وما شابه ذلك.

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

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

shopt -s dotglob

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

وإذا لم تكن هناك ملفات في الدليل المصدر، فلن تتمكن Shell من استبدال أي شيء بدلاً من العلامة النجمية، وسيفشل النسخ أيضًا مع وجود خطأ. هناك خيارات ضد هذا الوضع failglob и nullglob. سنحتاج إلى تعيين failglob، مما سيمنع تنفيذ الأمر. 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 غير موجود، فسنحصل على ما نحتاج إليه.

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

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

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

cp -a /source /home

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

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

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

cp -a /source/. /target

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

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

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

cp -a /source/. /target

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

النتائج

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

خاتمة

com.vmspike اقترح إصدار أمر بنتيجة مماثلة:

cp -a -T /source /target

Oz_Alex

cp -aT /source /target

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

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

PS يرجى إرسال أية أخطاء تلاحظها في رسالة خاصة. أقوم بزيادة الكارما الخاصة بي لهذا الغرض.

أمر cp: نسخ مجلدات الملفات بشكل صحيح في *nix

المصدر: www.habr.com

إضافة تعليق