Cp Command

1) ما هو أمر cp ولماذا نستخدمه؟

أمر cp اختصار لـ Copy
ووظيفته: نسخ الملفات والمجلدات من مكان إلى مكان.

تستخدمه عندما تريد:

  • أخذ نسخة احتياطية من ملف قبل التعديل
  • نسخ ملفات إلى مجلد مشروع
  • نسخ مجلد كامل بمحتوياته
  • نقل ملفات متعددة دفعة واحدة (نسخ وليس نقل)
  • الحفاظ على الصلاحيات والأوقات الأصلية أثناء النسخ

الفرق بينه وبين mv:
cp ينسخ ويترك الأصل، أما mv ينقل/يعيد تسمية ويزيل الأصل من مكانه.

2) الصيغة العامة (Syntax)
نسخ ملف إلى ملف (مع تغيير الاسم أو نفس الاسم بمكان آخر)
cp [OPTIONS] SOURCE DEST
Bash
نسخ عدة ملفات إلى مجلد
cp [OPTIONS] SOURCE1 SOURCE2 ... DIRECTORY/
Bash
3) نسخ ملف واحد (أبسط مثال)
أ) نسخ ملف مع اسم جديد
cd ~/project
touch sample.txt
cp sample.txt copy_of_sample.txt
Bash

تحقق:

ls -l
Bash
ب) نسخ ملف إلى مجلد
mkdir -p backup
cp sample.txt backup/
Bash

هنا سيصبح الملف داخل backup بنفس الاسم.

تحقق:

ls -l backup
Bash
4) نسخ عدة ملفات دفعة واحدة

لازم يكون “الوجهة الأخيرة” مجلد:

cd ~/project
touch file1.txt file2.txt
mkdir -p dir1

cp file1.txt file2.txt dir1/
Bash

تحقق:

ls -l dir1
Bash
5) نسخ مجلد (مهم جدًا): -r أو -R
أ) نسخ مجلد كامل بمحتوياته
cd ~/project
mkdir -p dirA
touch dirA/a.txt

cp -r dirA dirB
Bash

تحقق:

ls -R dirB
Bash

بدون -r سيظهر خطأ لأن cp لا ينسخ المجلدات افتراضيًا.

6) انتبه: الفرق بين نسخ “المجلد نفسه” ونسخ “محتواه”

هذه نقطة يقع فيها كثير مبتدئين.

أ) نسخ المجلد نفسه (ينشئ مجلد جديد)
cp -r dirA dirB
Bash

النتيجة:

  • dirB/ يحتوي نفس محتوى dirA/
ب) نسخ محتوى المجلد فقط إلى مجلد موجود

إذا كان dirB موجودًا:

mkdir -p dirB
cp -r dirA/* dirB/
Bash

هذا ينسخ الملفات داخل dirA فقط إلى dirB (بدون إنشاء dirA بداخله).

أهم شكل واضح ودقيق لنسخ محتوى المجلد حتى لو فيه مخفي:

cp -a dirA/. dirB/
Bash

(سنشرح -a بعد قليل)

7) خيارات مهمة جدًا للمبتدئين (تحميك من أخطاء)
أ) عدم الاستبدال إذا الملف موجود: -n
cp -n file1.txt dir1/
Bash
ب) يسألك قبل الاستبدال: -i (Interactive)
cp -i file1.txt dir1/
Bash
ج) الاستبدال بدون سؤال (خطير): -f
cp -f file1.txt dir1/
Bash

للمبتدئ أنصح غالبًا بـ -i حتى لا تمسح ملفات بالغلط.

8) عرض ما يحدث أثناء النسخ: -v

مفيد جدًا للتعلم والمتابعة:

cp -v file1.txt dir1/
Bash
9) الحفاظ على الخصائص والأوقات (Attributes & Timestamps)
أ) -p (preserve)

يحافظ على:

  • الصلاحيات (permissions)
  • المالك/المجموعة (إذا أمكن)
  • أوقات الملف (timestamps)

مثال:

touch -t 202304010000 sample.txt
cp -p sample.txt copy_p.txt
ls -l sample.txt copy_p.txt
Bash
ب) الأفضل غالبًا: -a (archive)

الخيار -a “أرشفة” وهو الأكثر استخدامًا للنسخ الاحترافي لأنه يحافظ على كل شيء تقريبًا ويعمل بشكل ممتاز مع المجلدات.

cp -a dirA dirA_backup
Bash

وأفضل طريقة لنسخ محتوى مجلد إلى مجلد موجود (بما فيه المخفي):

mkdir -p dirB
cp -a dirA/. dirB/
Bash

dirA/. معناها: “انسخ كل شيء داخل dirA بما فيه المخفي”.

10) دمج خيارات مفيد جدًا
مثال عملي: نسخ مجلد مع الحفاظ على كل شيء + إظهار التفاصيل
cp -av dirA dirA_backup
Bash
مثال: نسخ ملفات مع السؤال قبل الاستبدال + عرض ما يحدث
cp -iv file1.txt file2.txt dir1/
Bash
11) أخطاء شائعة (وأفضل حل)
أ) خطأ: “target is not a directory”

يعني أنت تحاول تنسخ عدة ملفات لكن الوجهة ليست مجلدًا:

cp file1.txt file2.txt newname.txt
Bash

✅ الحل: اجعل الوجهة مجلدًا:

mkdir -p dest
cp file1.txt file2.txt dest/
Bash
ب) خطأ عند نسخ مجلد بدون -r
cp dirA dirB
Bash

✅ الحل:

cp -r dirA dirB
Bash
ج) الملفات المخفية لا تُنسخ عند استخدام *
cp -r dirA/* dirB/
Bash

هذا لا ينسخ مثل .env و .gitignore.

✅ الحل الأفضل:

cp -a dirA/. dirB/
Bash
12) تدريب سريع (Practice)

نفّذ هذا التدريب لتثبت فهمك:

cd ~/project
mkdir -p cp_practice/src
touch cp_practice/src/a.txt cp_practice/src/.hidden
mkdir -p cp_practice/dest

# 1) نسخ ملف
cp cp_practice/src/a.txt cp_practice/dest/

# 2) نسخ مجلد بالكامل
cp -r cp_practice/src cp_practice/src_backup

# 3) نسخ محتوى src إلى dest (بما فيه المخفي)
cp -a cp_practice/src/. cp_practice/dest/

# 4) عرض النتائج
ls -la cp_practice/dest
ls -R cp_practice/src_backup
Bash
هل محتوى الشرح الأصلي كافي؟

نعم كبداية، لكنه يحتاج توسعة للمبتدئ في نقاط مهمة جدًا مثل:

  • الفرق بين نسخ المجلد ونسخ محتواه
  • موضوع الملفات المخفية مع *
  • الخيارات الآمنة مثل -i و -n
  • الفرق بين -p و -a (والأهم أن -a غالبًا أفضل للمجلدات)