Logo

أوامر Linux - الجزء الأول

21 دقيقة قراءة
شرائح الدرس
1 / 17

نظم التشغيل 1 - الدرس التاسع

أوامر Linux - الجزء الأول

التنقل في نظام الملفات، وإدارة الملفات والمجلدات، وعرض النصوص وتحريرها، والتحكم في الصلاحيات، والبحث، وأرشفة مشروع كامل من الـ terminal.

بنهاية هذا الدرس ستكون قادرا على التنقل في نظام ملفات Linux، وإدارة الملفات والمجلدات، وعرض النصوص وتحريرها، والتحكم في الصلاحيات، والبحث في النصوص، وأرشفة مشروع كامل من الـ terminal.

الأهداف

  • قراءة وفهم الـ shell prompt وبنية الأوامر العامة
  • الحصول على المساعدة لأي أمر باستخدام man و--help
  • التنقل في نظام الملفات بثقة باستخدام pwd وcd، بما في ذلك اختصارات ~ و.. و-
  • عرض محتويات المجلد باستخدام ls وقراءة مخرجات -a و-l و-lh و-F و-d
  • العمل بشكل أسرع باستخدام الإكمال التلقائي بمفتاح Tab والسجل التاريخي للأوامر
  • إنشاء ونسخ ونقل وحذف الملفات والمجلدات بأمان
  • عرض وتحرير الملفات النصية باستخدام less وcat وhead وtail وnano
  • إعادة توجيه مخرجات الأوامر إلى ملفات باستخدام echo مع > و>>
  • شرح ملكية الملفات في Linux (المستخدم، المجموعة، الآخرون) وقراءتها من ls -l
  • تغيير الصلاحيات باستخدام chmod بالطريقتين الرمزية والثمانية (octal)
  • البحث في النصوص باستخدام grep، بما في ذلك تمرير مخرجات ls إلى grep عبر pipe
  • أرشفة وضغط الملفات والمجلدات باستخدام tar وgzip وzip
  • مقارنة حجم مجلد بحجم أرشيفه الخاص باستخدام du -sh

المتطلبات السابقة

  • الوصول إلى terminal على نظام Ubuntu Linux (تثبيت محلي، أو virtual machine، أو سيرفر بعيد يتم الوصول إليه عبر SSH)
  • حساب مستخدم عادي غير root (الأخطاء تبقى محدودة الأثر عندما لا تعمل بحساب root الإداري)
  • القدرة على فتح نافذة terminal
  • لا يفترض أي خبرة سابقة في سطر الأوامر

هذا هو الجزء الأول من درس مكون من جزءين. أوامر معلومات النظام مثل df وfree وhostname وdate وcal وwhoami وid وping مغطاة في الجزء الثاني.

الـ Shell، وسطر الأوامر (Prompt)، وبنية الأوامر

الـ shell تقرأ النص الذي تكتبه، وتشغله كأمر، وتطبع النتيجة. السطر الذي تكتب فيه هو الـ prompt؛ وعلى Ubuntu يظهر فيه غالبا اسم المستخدم، واسم الجهاز (hostname)، والمجلد الحالي، مختصرا إلى ~ عند الإشارة إلى المجلد الرئيسي (home directory).

كل أمر في Linux يتبع النمط العام نفسه:

command [options] [arguments]
  • command: البرنامج المطلوب تشغيله
  • options: خيارات تغير سلوك الأمر، وتكتب عادة بشرطة واحدة - (الصيغة القصيرة، مثل -a) أو بشرطتين -- (الصيغة الطويلة، مثل --all)
  • arguments: الملفات أو المجلدات أو البيانات الأخرى التي يجب على الأمر العمل عليها

يمكن كتابة أكثر من أمر في سطر واحد بفصلها بفاصلة منقوطة ;، فتشغل كل واحدة بعد الأخرى. مثلا، cd /usr/share; pwd يغير المجلد أولا، ثم يطبع الموقع الجديد.

هناك أداتان للمساعدة متاحتان دائما. man يفتح صفحة الدليل الكاملة (manual page) لأمر ما؛ man -k keyword يبحث بكلمة مفتاحية، وman -f command يبحث عن الصفحة الدقيقة لاسم معين. أما --help، الملحقة بأي أمر تقريبا، فتطبع ملخصا قصيرا لطريقة الاستخدام مباشرة على الـ terminal بدلا من ذلك:

man chmod
chmod --help

السطر الأول يفتح صفحة الدليل الكاملة لـ chmod؛ والسطر الثاني يطبع ملخصا سريعا لخيارات chmod دون مغادرة الـ prompt.

التنقل في نظام الملفات باستخدام pwd وcd

عند تسجيل الدخول، توضع في المجلد الرئيسي (home directory)، وهو مكان مخصص لملفاتك الخاصة. pwd (print working directory) يعرض المسار الكامل للمجلد الحالي، محسوبا من المجلد الجذر (root directory)، الذي يكتب كشرطة واحدة /:

pwd
[Output]
/home/student

cd (change directory) ينقلك إلى مكان آخر. المسار المطلق (absolute path) يبدأ بـ / ويصف موقعا من المجلد الجذر، وهو غير قابل للالتباس من أي مكان. المسار النسبي (relative path) لا يبدأ بشرطة ويصف موقعا بدءا من المكان الذي أنت فيه حاليا.

flowchart TD
    root["/ (root)"] --> usr[usr]
    root --> home[home]
    usr --> share[share]
    share --> locale[locale]
    locale --> en[en]
    en --> LC[LC_MESSAGES]
    home --> student["student (home directory)"]

من المجلد الرئيسي، cd /usr/share هو نقل مطلق إلى share في الرسم أعلاه. من داخل share، cd locale هو نقل نسبي مستوى واحدا للأسفل. وباستمرار من داخل locale بعد تلك الخطوة، cd en/LC_MESSAGES هو نقل نسبي مستويين للأسفل في خطوة واحدة، ينتهي بك في LC_MESSAGES. (المجلدات الموجودة فعليا تحت /usr/share تختلف من نظام لآخر؛ هذا مجرد مسار توضيحي واحد لبيان الفرق بين النقل المطلق والنسبي.) ثلاثة مراجع خاصة تجعل التنقل أسرع:

  • ~ تعني دائما المجلد الرئيسي، فـ cd ~ (أو cd بمفردها بدون argument) يعيدك إليه من أي مكان
  • .. تعني المجلد الأب (parent) للمجلد الحالي، فـ cd .. ينقلك مستوى واحدا للأعلى بالضبط
  • - تعني المجلد السابق الذي كنت فيه، فـ cd - يعيدك إلى المكان الذي كنت فيه قبل آخر cd

عرض محتويات المجلد، والإكمال التلقائي بـ Tab، والسجل التاريخي

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

  • -a يعرض كل العناصر، بما في ذلك الملفات المخفية، بالإضافة إلى العنصرين الخاصين . (المجلد الحالي) و.. (المجلد الأب)
  • -l يعرض قائمة طويلة ومفصلة: نوع الملف وصلاحياته، عدد الـ links (كم hard link يشير إلى هذا الملف؛ ملف جديد عادي يظهر 1)، المالك، المجموعة، الحجم، تاريخ آخر تعديل، والاسم
  • -lh هو القائمة الطويلة نفسها مع عرض حجم الملفات بشكل مقروء للإنسان (KB وMB وGB) بدلا من البايتات الخام
  • -F يضيف حرف مؤشر بعد بعض العناصر لتمييز أنواعها بسرعة؛ على المجلدات المستخدمة في هذا الدرس، هذا المؤشر هو / بعد أسماء المجلدات
  • -d يعرض معلومات عن المجلد نفسه بدلا من عرض محتوياته، وغالبا يستخدم مع -l بصيغة ls -ld
ls -a
[Output]
.  ..  .bashrc  .profile  file1

هنا .bashrc و.profile هما ملفا إعدادات مخفيان، و. و.. هما المرجعان المدمجان للمجلد الحالي والأب المذكوران أعلاه.

كتابة الأسماء كاملة أمر بطيء وعرضة للخطأ، لذلك تقدم الـ shell الإكمال التلقائي بـ Tab (tab completion): تكتب أول حروف اسم وتضغط Tab فيكتمل الباقي تلقائيا. تحتفظ الـ shell أيضا بـ سجل تاريخي للأوامر (command history): مفتاحا السهم للأعلى والأسفل يمرران على الأوامر التي شغلتها من قبل، وأمر history يسردها مرقمة، بحيث يمكن إعادة تشغيل أمر سابق بكتابة ! متبوعة برقمه، فمثلا !42 يعيد تشغيل الأمر الذي يحمل رقم 42 في السجل (و!! تعيد تشغيل آخر أمر بدلا من ذلك). يمكن تصفية تلك القائمة بتمريرها إلى grep عبر عملية الـ pipe | (تشرح بالتفصيل لاحقا في هذا الدرس)، كما في history | grep chmod، الذي يضيق القائمة إلى السطور المحتوية على كلمة معينة.

إنشاء ونسخ ونقل وحذف الملفات والمجلدات

أمر touch ينشئ ملفا جديدا فارغا، أو، إذا كان الملف موجودا بالفعل، يحدث فقط طابع وقت آخر تعديل له (timestamp):

touch file1

أمر mkdir ينشئ مجلدا جديدا فارغا. في العادة يجب أن يكون المجلد الأب موجودا مسبقا؛ خيار -p يزيل هذا الشرط بإنشاء كل مجلد مفقود على طول المسار المعطى في خطوة واحدة:

mkdir -p lab9_project/docs/reports

هذا الأمر الواحد ينشئ lab9_project، ثم docs بداخله، ثم reports بداخل docs، مع أن أيا منها لم يكن موجودا من قبل.

تقوم الـ shell أيضا بتوسيع قائمة مفصولة بفواصل داخل أقواس معقوفة، {a,b,c}، إلى عدة arguments منفصلة قبل تشغيل الأمر أصلا، وهذا يتيح لـ mkdir إنشاء عدة مجلدات شقيقة (sibling) في نداء واحد:

mkdir -p project/{docs,scripts,data}

تعيد الـ shell كتابة هذا الأمر إلى mkdir -p project/docs project/scripts project/data قبل تشغيله، فتنشأ المجلدات الثلاثة داخل project في أمر واحد.

cp ينسخ ملفا إلى موقع أو اسم جديد، تاركا الأصل في مكانه. الخيار -r (recursive) مطلوب لنسخ مجلد كامل مع كل ما بداخله. الخيار -i (interactive) يجعل cp يطلب تأكيدا قبل الكتابة فوق ملف موجود، وذلك للحماية من فقدان البيانات عن طريق الخطأ:

cp -i notes.txt notes_backup.txt
cp -r docs docs_backup

السطر الأول ينسخ notes.txt إلى notes_backup.txt، ويسأل أولا إذا كان هذا الاسم موجودا مسبقا؛ والسطر الثاني ينسخ مجلد docs بالكامل recursively، بما فيه كل ما بداخله مثل reports، إلى مجلد جديد اسمه docs_backup.

نوع الهدف يغير ما يعنيه فعليا "النسخ إلى اسم موجود مسبقا". النسخ إلى اسم ملف موجود يكتب فوق محتوى ذلك الملف، وهذا بالضبط ما يحمي منه -i أعلاه. النسخ إلى اسم مجلد موجود يتصرف بشكل مختلف: يوضع المصدر داخل ذلك المجلد بدلا من استبداله. مثلا، بعد وجود docs_backup، فإن cp notes.txt docs_backup لا يكتب فوق docs_backup؛ بل ينشئ نسخة جديدة من notes.txt بداخله.

mv ينقل ملفا أو مجلدا إلى موقع جديد، وهو أيضا الطريقة التي يعاد بها تسمية العناصر، لأن إعادة التسمية هي فقط "نقل" شيء إلى اسم جديد في نفس المكان:

mv draft.txt docs_backup/
mv docs_backup archive_backup

السطر الأول ينقل draft.txt إلى داخل docs_backup؛ والسطر الثاني يعيد تسمية docs_backup إلى archive_backup. إذا كانت الوجهة موجودة مسبقا كملف، فيتم الكتابة فوقها بصمت ودون إمكانية استرجاعها، لذلك يجب الحذر مع cp وmv معا. نفس خيار -i المستخدم مع cp يعمل أيضا مع mv، ويطلب تأكيدا قبل الكتابة فوق وجهة موجودة: mv -i draft.txt docs_backup/.

rm يحذف الملفات؛ وrmdir يحذف مجلدا فقط إذا كان فارغا تماما (وإلا يرفض). لحذف مجلد وكل ما بداخله، يحتاج rm إلى خيار -r (recursive)، ويكتب -R في بعض المراجع، وهو يعمل بالطريقة نفسها؛ إضافة -f (force) تلغي أيضا طلبات التأكيد، وهذا مناسب لكنه خطير لأنه يحذف دون سؤال. لا يوجد تراجع (undo) لـ rm:

rmdir empty_folder
rm -r archive_backup
rm -rf temp_folder

هذه الأسطر الثلاثة أمثلة مستقلة، وليست تسلسلا مستمرا على المجلدات نفسها: الأول يحذف مجلدا اسمه empty_folder وسيفشل برسالة خطأ بدلا من ذلك لو لم يكن فارغا؛ والثاني يحذف archive_backup (الذي أنشئ سابقا في هذا القسم) مع كل ما بداخله؛ والثالث يحذف مجلدا اسمه temp_folder، وبسبب -f، يفعل ذلك دون طلب تأكيد حتى لو لم يكن temp_folder فارغا.

عرض وتحرير محتوى الملفات

عدة أوامر تعرض محتوى الملفات دون فتح محرر كامل. cat يطبع الملف كاملا مرة واحدة ويعود فورا إلى الـ prompt؛ و-n يرقم كل سطر مطبوع. إعطاء cat أكثر من اسم ملف واحد يعرضها واحدا بعد الآخر كما لو كانت ملفا واحدا. head يعرض، افتراضيا، أول 10 سطور من الملف، وtail يعرض آخر 10 سطور، وهذا مفيد للتحقق من بداية أو نهاية ملف طويل دون طباعته كاملا.

cat -n report.txt
[Output]
     1  Report for Lab 9
     2  Second finding

هذا يطبع سطري الملف مرة أخرى على الـ terminal، كل واحد يسبقه رقم سطره، لأن -n تم تمريره.

للملفات الأطول من شاشة واحدة، يفتح less الملف في pager قابل للتمرير بدلا من طباعته دفعة واحدة: مفاتيح الأسهم، أو مفتاح المسافة، أو Ctrl+f تنقل صفحة للأمام، وCtrl+b تنقل صفحة للخلف، و/word تبحث للأمام، وn/N تكرر ذلك البحث للأمام/للخلف، وq تخرج.

لتحرير محتوى ملف، nano محرر بسيط للمبتدئين يستحوذ على الـ terminal بالطريقة نفسها التي يفعلها less. أمر nano filename يحرر ملفا موجودا أو يبدأ ملفا جديدا. للحفظ، يضغط Ctrl+O (WriteOut)، ثم Enter لتأكيد اسم الملف. للخروج، يضغط Ctrl+X؛ وإذا كانت هناك تغييرات غير محفوظة، يسأل nano إذا كان يجب حفظها (Y يحفظ ويخرج، N يتجاهل ويخرج، Ctrl+C يلغي). Ctrl+G يفتح المساعدة المدمجة في nano.

flowchart TD
    A[Editing in nano] --> B[Press Ctrl+X to leave]
    B --> C{Unsaved changes?}
    C -- No --> G[Back at the shell prompt]
    C -- Yes --> D{Press Y, N, or Ctrl+C}
    D -- Y --> E[Save and exit]
    D -- N --> F[Discard changes and exit]
    D -- Ctrl+C --> H[Cancel, stay in nano]
    E --> G
    F --> G

إعادة توجيه المخرجات باستخدام echo

أمر echo يطبع النص المعطى له على الـ terminal:

echo "Report for Lab 9"
[Output]
Report for Lab 9

هذا يطبع فقط النص المعطى مرة أخرى على الـ terminal، دون حفظ أي شيء في أي مكان بعد.

يمكن إرسال نفس هذا المخرج إلى ملف بدلا من ذلك باستخدام عامل إعادة توجيه (redirection). > يكتب داخل الملف المذكور، وينشئه إذا لزم الأمر، ويكتب فوق أي محتوى سابق بالكامل (overwrite). >> بدلا من ذلك يضيف (append) إلى نهاية الملف، وينشئه فقط إذا لم يكن موجودا مسبقا:

echo "Report for Lab 9" > report.txt
echo "Second finding" >> report.txt

بعد هذين السطرين، يحتوي report.txt على الجملتين معا، كل واحدة في سطر، لأن الأمر الثاني أضاف بدلا من أن يستبدل. تشغيل echo "New content" > report.txt مرة ثالثة سيمحو السطرين الموجودين ويترك فقط "New content".

ملكية الملفات وصلاحياتها

كل ملف ومجلد له ثلاث فئات من الملكية: المالك (owner) (المستخدم الذي أنشأه ويتحكم فيه عادة)، والمجموعة (group) (مجموعة مسماة من المستخدمين يتشاركون نفس الوصول)، والآخرون (others) (كل شخص آخر، ويحصل عادة على أقل صلاحيات). تظهر هذه في العمودين الثالث والرابع من قائمة ls -l:

ls -l report.txt
[Output]
-rw-r--r-- 1 student students 34 Oct 12 10:30 report.txt

هنا الـ 1 مباشرة بعد نص الصلاحيات هو عدد الـ links، كم hard link يشير إلى هذا الملف، واحد فقط في هذه الحالة؛ student هو المالك وstudents هي المجموعة؛ وكل من ليس أيا منهما يعامل كـ "آخرون".

العمود الأول، -rw-r--r--، هو نص الصلاحيات (permission string). حرفه الأول هو نوع الملف (- لملف، d لمجلد)، والأحرف التسعة الباقية هي ثلاث مجموعات من ثلاثة: المالك، والمجموعة، والآخرون، بهذا الترتيب، كل واحدة تمثل القراءة (r)، والكتابة (w)، والتنفيذ (x)، مع - تشير إلى صلاحية غير ممنوحة. القراءة تفتح الملف أو تسرد محتويات مجلد؛ الكتابة تعدل ملفا أو تسمح بإنشاء أو حذف عناصر داخل مجلد؛ التنفيذ يشغل ملفا كبرنامج أو يسمح بدخول مجلد باستخدام cd.

flowchart TD
    A[A user tries to access a file] --> B{Is the user the file's owner?}
    B -- Yes --> C[The owner permission triad applies]
    B -- No --> D{Is the user in the file's group?}
    D -- Yes --> E[The group permission triad applies]
    D -- No --> F[The others permission triad applies]

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

كل صلاحية لها أيضا قيمة عددية: القراءة 4، الكتابة 2، التنفيذ 1، وبدون صلاحية 0. جمع القيم لثلاثية واحدة يعطي رقما ثمانيا (octal) واحدا، فـ rwx تساوي 7، وrw- تساوي 6، وr-x تساوي 5، وr-- تساوي 4. ثلاثة أرقام معا، رقم لكل ثلاثية، تصف صلاحيات الملف كاملة؛ chmod 755 file يضبط المالك على rwx، والمجموعة على r-x، والآخرون على r-x.

chmod (change mode) يغير الصلاحيات بطريقتين.

الطريقة الرمزية (symbolic)، باستخدام chmod [who][operation][permission] name، حيث who هي u (المالك owner)، أو g (المجموعة group)، أو o (الآخرون others)، أو a (الكل all)؛ وoperation هي + (إضافة)، أو - (إزالة)، أو = (ضبط بالضبط)؛ وpermission أي توليفة من r وw وx:

chmod u+x script.sh
chmod g-w report.txt
chmod u=rw,g=r,o= file.txt

السطر الأول يضيف صلاحية التنفيذ لمالك script.sh؛ والسطر الثاني يزيل صلاحية الكتابة من المجموعة على report.txt. السطر الثالث يوضح أنه يمكن دمج عدة عبارات who=permission في نداء واحد بفصلها بفواصل: يضبط المالك على rw، والمجموعة على r، وبدون أي شيء مكتوب بعد آخر =، يمسح كل صلاحية للآخرين.

الطريقة الثمانية (octal)، باستخدام chmod NNN name برقم واحد لكل ثلاثية يحسب كما سبق:

chmod 644 report.txt
chmod 755 script.sh
chmod 700 private_folder

السطر الأول يترك report.txt بصلاحيات rw-r--r-- (المالك يقرأ ويكتب، والمجموعة والآخرون يقرآن فقط)؛ والسطر الثاني يترك script.sh بصلاحيات rwxr-xr-x (المالك له وصول كامل، والمجموعة والآخرون يقرآن وينفذان)؛ والسطر الثالث يترك private_folder بصلاحيات rwx------ (المالك فقط له أي وصول على الإطلاق).

البحث في النصوص باستخدام grep

grep يبحث عن قطعة نص (pattern) داخل ملف أو داخل مخرجات أمر آخر، ويطبع كل سطر مطابق. -i يجعل البحث يتجاهل الفرق بين الحروف الكبيرة والصغيرة:

grep "Lab" report.txt
grep -i "lab" report.txt

السطر الأول يطابق فقط السطور المحتوية على Lab بالحالة (case) نفسها بالضبط؛ والثاني، مع -i، يطابق أيضا lab أو LAB أو أي شكل آخر من الأحرف.

يصبح grep أكثر فائدة مع عملية الـ pipe |، التي ترسل مخرجات الأمر الموجود على يسارها كمدخل للأمر الموجود على يمينها بدلا من طباعتها. تمرير ls إلى grep عبر pipe يصفي قائمة مجلد إلى العناصر المطابقة فقط:

ls -l | grep report

هذا يشغل ls -l بشكل عادي، لكن بدلا من عرض كل عنصر، فقط السطور المحتوية على "report" تصل إلى الـ terminal.

الأرشفة والضغط باستخدام tar وgzip وzip

الأرشفة (archiving) تجمع عدة ملفات ومجلدات في ملف واحد دون تصغيرها بأي شكل، فقط للحفاظ عليها معا وسهولة نقلها كوحدة واحدة، وتنتج ملف .tar. الضغط (compression) بدلا من ذلك يقلل حجم الملف، باستخدام صيغ مثل .gz أو .zip.

tar (tape archive) ينشئ ويستخرج ويسرد الأرشيفات: c تنشئ، وx تستخرج، وt تسرد المحتويات، وf تحدد اسم الملف، وv (verbose) تطبع كل ملف وقت معالجته:

tar cvf backup.tar file1.txt file2.txt documents/
tar tvf backup.tar
tar xvf backup.tar

هذه الأسطر الثلاثة توضح أرشيفا واحدا بالتتابع: الأول يحزم file1.txt وfile2.txt ومجلد documents في backup.tar جديد، ويطبع كل اسم وقت إضافته؛ والثاني يسرد كل شيء مخزن داخل backup.tar دون استخراج أي شيء، تاركا المجلد الحالي دون تغيير؛ والثالث يستخرج كل شيء من backup.tar إلى المجلد الحالي.

gzip يضغط ملفا واحدا، ويضيف .gz ويحذف الأصل افتراضيا بعد الانتهاء. gzip -d filename.gz (أو gunzip filename.gz) يعكس هذا ويستعيد الأصل.

tar وgzip يدمجان معا بشكل شائع في أرشيف واحد مضغوط، إما كخطوتين أو أمر واحد باستخدام خيار z في tar:

flowchart LR
    subgraph Two steps
        A1["tar cvf project.tar project/"] --> A2["gzip project.tar"] --> A3["project.tar.gz"]
    end
    subgraph One step
        B1["tar czf project.tar.gz project/"] --> A3
    end

استخراج هذا النوع من الأرشيف في خطوة واحدة يستخدم tar xzf project.tar.gz (x استخراج، z فك الضغط، f اسم الملف).

zip يبني أرشيف .zip، مضغوط أيضا وقابل للقراءة على Windows. -r مطلوب لتضمين المجلدات recursively:

zip -r backup.zip file1.txt documents/
unzip backup.zip
unzip -l backup.zip
unzip backup.zip -d /path/to/destination/

السطر الأول ينشئ backup.zip محتويا file1.txt وكل ما بداخل documents/ recursively. unzip يستخرج أرشيف .zip؛ وunzip -l يسرد محتوياته دون استخراج؛ وunzip -d يستخرج إلى مجلد وجهة مختار بدلا من المجلد الحالي.

لمقارنة أرشيف بالمجلد الذي أنشئ منه، أمر du (disk usage) يقرر مقدار المساحة التي يشغلها مجلد. -s يعطي إجماليا واحدا مختصرا بدلا من سطر لكل ملف بداخله، و-h يطبع ذلك الإجمالي بشكل مقروء للإنسان مثل 4.0K أو 2.3M، بالطراز نفسه الذي يعطيه -h مع ls -lh:

du -sh documents

هذا يطبع سطرا واحدا: الحجم الإجمالي لكل ما بداخل documents، متبوعا باسم المجلد.

مهام تطبيقية

المهمة 1: استكشاف الـ Shell، الحصول على المساعدة، وعرض الملفات

  1. افتح terminal وشغل pwd. المخرج المتوقع: مسار مجلدك الرئيسي، مثلا /home/student.
  2. شغل man ls. تفتح صفحة الدليل في نفس عارض التمرير المستخدم مع less، فاضغط q لإغلاقها والعودة إلى الـ prompt. المخرج المتوقع: تفتح صفحة دليل ls وتملأ الـ terminal.
  3. شغل ls --help. المخرج المتوقع: قائمة خيارات مختصرة تطبع مباشرة، دون pager.
  4. شغل cd /usr/share، ثم بالتتابع ls وls -a وls -l وls -lh وls -F. المخرج المتوقع: ls يعرض الأسماء البسيطة؛ و-a تضيف . و.. والملفات المخفية؛ و-l تعرض سطرا مفصلا واحدا لكل عنصر (الصلاحيات، المالك، المجموعة، الحجم، التاريخ)؛ و-lh تعرض نفس الشيء بأحجام مثل 4.0K بدلا من البايتات الخام؛ و-F تضيف / بعد كل اسم مجلد (قد ترى أيضا مؤشرات أخرى مثل @ أو * على بعض العناصر؛ هذه المهمة تغطي فقط مؤشر /).
  5. اكتب cd /usr/sh ثم اضغط Tab. المخرج المتوقع: تكمل الـ shell المسار إلى /usr/share/.
  6. شغل history، ثم history | grep ls. المخرج المتوقع: أوامر أخيرة مرقمة؛ التشغيل الثاني يعرض فقط السطور المحتوية على "ls".

المهمة 2: التنقل وتنظيم المجلدات

  1. عد إلى مجلدك الرئيسي أولا بـ cd ~، ثم شغل cd /usr/share متبوعا بـ pwd. المخرج المتوقع: /usr/share.
  2. شغل cd -. المخرج المتوقع: يطبع مسار مجلدك الرئيسي ويعيدك إليه.
  3. شغل mkdir -p lab9_project/docs/reports. المخرج المتوقع: بدون رسالة، لكن lab9_project وlab9_project/docs وlab9_project/docs/reports جميعها موجودة الآن.
  4. شغل cd lab9_project/docs/reports، ثم cd ..، ثم cd ..، ثم pwd. المخرج المتوقع: المسار ينتهي الآن بـ lab9_project.
  5. شغل mkdir empty_test ثم rmdir empty_test. المخرج المتوقع: يحذف بصمت دون خطأ، لأنه كان فارغا.
  6. شغل rmdir docs. المخرج المتوقع: خطأ يذكر أن المجلد غير فارغ، لأن docs لا يزال يحتوي على reports.

المهمة 3: إنشاء ونسخ ونقل وحذف الملفات

  1. داخل lab9_project، شغل touch notes.txt draft.txt. المخرج المتوقع: ls يسرد الملفين الجديدين الفارغين.
  2. شغل cp -i notes.txt notes_backup.txt. المخرج المتوقع: ينسخ بصمت لأن notes_backup.txt لم يكن موجودا؛ ls يعرض الملفين.
  3. شغل cp -r docs docs_backup. المخرج المتوقع: يظهر مجلد docs_backup جديد، يحتوي على نسخته الخاصة من reports.
  4. شغل mv draft.txt docs_backup/. المخرج المتوقع: ينتقل draft.txt من lab9_project إلى docs_backup.
  5. شغل rm notes_backup.txt. المخرج المتوقع: يحذف دون تأكيد؛ لا يظهر بعد ذلك في ls.
  6. شغل rm -r docs_backup. المخرج المتوقع: يحذف docs_backup وكل ما بداخله، بما في ذلك draft.txt.

المهمة 4: عرض وتحرير وإعادة توجيه النصوص

(استمرارا داخل lab9_project من المهمة السابقة؛ شغل cd ~/lab9_project إذا لم تكن متأكدا.)

  1. شغل echo "Report for Lab 9" > report.txt ثم cat report.txt. المخرج المتوقع: السطر الواحد Report for Lab 9.
  2. شغل echo "Second finding" >> report.txt ثم cat -n report.txt. المخرج المتوقع: سطران مرقمان، 1 و2، لأن >> أضافت بدلا من أن تكتب فوق المحتوى.
  3. شغل echo "This replaces everything" > report.txt ثم cat report.txt. المخرج المتوقع: فقط السطر الجديد يظهر؛ السطران السابقان اختفيا لأن > تكتب فوق المحتوى.
  4. شغل head /etc/services وtail /etc/services. المخرج المتوقع: أول 10 سطور، ثم آخر 10 سطور من الملف.
  5. شغل nano report.txt، أضف سطرا يقول Lab 9 edited with nano، احفظ بـ Ctrl+O ثم Enter، واخرج بـ Ctrl+X. المخرج المتوقع: رجوع إلى الـ prompt؛ cat report.txt يعرض الآن السطر المضاف.
  6. شغل less report.txt، مرر بمفاتيح الأسهم، ثم اضغط q. المخرج المتوقع: المحتوى يعرض صفحة تلو الأخرى؛ الـ pager يغلق عند q.

المهمة 5: الملكية والصلاحيات والبحث

(استمرارا داخل lab9_project من المهمة السابقة؛ شغل cd ~/lab9_project إذا لم تكن متأكدا.)

  1. شغل ls -l report.txt. المخرج المتوقع: سطر مثل -rw-r--r-- 1 student students 34 Oct 12 10:30 report.txt؛ حدد حقلي المالك والمجموعة.
  2. شغل chmod u+x report.txt ثم ls -l report.txt مرة أخرى. المخرج المتوقع: ثلاثية المالك تتغير من rw- إلى rwx.
  3. شغل chmod g-r report.txt ثم ls -l report.txt. المخرج المتوقع: ثلاثية المجموعة (group) تفقد r لتصبح ---.
  4. شغل chmod 644 report.txt ثم ls -l report.txt. المخرج المتوقع: نص الصلاحيات يعود إلى -rw-r--r--.
  5. شغل chmod 700 . ثم ls -ld . (المجلد الحالي هو lab9_project، فـ . تشير إليه مباشرة). المخرج المتوقع: drwx------، مما يعطي المالك فقط أي وصول.
  6. شغل grep "Lab" report.txt. المخرج المتوقع: السطر المطابق يطبع؛ كلمة غير موجودة في الملف لا تطبع شيئا.
  7. شغل ls -l | grep report. المخرج المتوقع: فقط سطر report.txt من القائمة الطويلة، مصفى من باقي الأسطر.

المهمة 6: تحدي شامل - أرشفة مشروع كامل

بناء بنية المشروع التالية وأرشفتها، باستخدام أوامر هذا الدرس فقط.

  1. عد إلى مجلدك الرئيسي أولا: cd ~. ثم أنشئ بنية المجلدات في أمر واحد:
    mkdir -p final_project/{docs,scripts,data}
    المخرج المتوقع: docs وscripts وdata، جميعها منشأة داخل مجلد final_project جديد.
  2. عبئ كل مجلد باستخدام إعادة توجيه echo:
    echo "Project documentation" > final_project/docs/readme.txt
    echo "#!/bin/bash" > final_project/scripts/run.sh
    echo "echo 'Running project'" >> final_project/scripts/run.sh
    echo "id,value" > final_project/data/data.csv
    echo "1,100" >> final_project/data/data.csv
    المخرج المتوقع: كل ملف موجود بالمحتوى المعروض، ويتأكد من ذلك بـ cat.
  3. اضبط الصلاحيات: المجلدات إلى 755، ملفات البيانات والوثائق إلى 644، السكريبت إلى 755:
    chmod 755 final_project final_project/docs final_project/scripts final_project/data
    chmod 644 final_project/docs/readme.txt final_project/data/data.csv
    chmod 755 final_project/scripts/run.sh
    المخرج المتوقع: ls -l داخل كل مجلد فرعي يعرض نصوص الصلاحيات المطلوبة.
  4. تأكد بالبحث: شغل ls -l final_project/scripts | grep run.sh. المخرج المتوقع: سطر واحد بالضبط، run.sh بصلاحيات rwxr-xr-x.
  5. أنشئ أرشيفا مضغوطا واحدا للمشروع كاملا في أمر واحد:
    tar czf final_project.tar.gz final_project/
    المخرج المتوقع: ملف جديد final_project.tar.gz في المجلد الحالي.
  6. اسرد محتويات الأرشيف دون استخراجه، ثم قارن الأحجام:
    tar tvf final_project.tar.gz
    du -sh final_project
    ls -lh final_project.tar.gz
    المخرج المتوقع: tar tvf يسرد كل ملف ومجلد في الأرشيف؛ أوامر الحجم تظهر أن الأرشيف المضغوط قريب من حجم المجلد الأصلي أو أصغر منه.
  7. أنتج نسخة .zip من نفس المشروع كأرشيف متوافق مع Windows:
    zip -r final_project.zip final_project/
    unzip -l final_project.zip
    المخرج المتوقع: ينشأ final_project.zip؛ وunzip -l يسرد نفس ملفات أرشيف tar، مؤكدا أن كليهما يحتوي على محتوى متطابق.

الخلاصة

غطى هذا الدرس أساسيات العمل كمستخدم عادي على Ubuntu من الـ terminal. كل أمر يتبع command [options] [arguments]، وأمرا man و--help يستعلمان دائما عن السلوك الدقيق لأي أمر. pwd وcd (مع ~ و.. و-) ينقلانك في نظام الملفات، بينما ls وخياراتها -a و-l و-lh و-F و-d تكشف ما يوجد داخل مجلد، مسرعة بالإكمال التلقائي بـ Tab والسجل التاريخي للأوامر.

تدار الملفات والمجلدات بـ mkdir -p وtouch وcp (-r للمجلدات، -i لتجنب الكتابة فوق الملفات) وmv وrmdir وrm (-r للمجلدات، -f لتجاوز التأكيد، بدون تراجع). تعرض محتوياتها بـ less وcat/cat -n وhead وtail، وتحرر بـ nano (Ctrl+O للحفظ، Ctrl+X للخروج)، وتكتب مباشرة بـ echo باستخدام > للكتابة فوق المحتوى و>> للإضافة.

كل ملف يحمل ثلاثة مستويات من الملكية، المالك والمجموعة والآخرون، تظهر في ls -l، وصلاحيات القراءة والكتابة والتنفيذ الخاصة بها تتغير بـ chmod إما رمزيا (u وg وo وa مع + و- و=) أو عدديا (4 و2 و1 مجموعة في رقم ثماني من ثلاث خانات). grep، بمفرده أو ممررا بعد ls عبر pipe، يصفي النص إلى ما يهم. وأخيرا، tar يجمع الملفات معا، وgzip وzip يصغرانها، والاثنان يدمجان في أرشيف واحد مضغوط وقابل للنقل لمشروع كامل.