أوامر لينكس، الجزء 1
في الدرس العملي 8 ثبت أوبونتو واستكشفته بالفأرة: سطح المكتب، وتطبيق الملفات (Files)، وشجرة مجلدات لينكس. ويواصل هذا الدرس استكشاف أوبونتو بصفتك مستخدما عاديا، لكن من الطرفية (terminal) هذه المرة. ستتعلم كيف تعرف مكانك، وكيف تستعرض ما حولك، وكيف تتنقل في شجرة المجلدات، وكيف تقرأ الملفات، وكيف تنشئ الملفات والمجلدات وتنسخها وتنقلها وتعيد تسميتها وتحذفها بكتابة الأوامر. فلكل ما فعلته الأسبوع الماضي بالنقر بالزر الأيمن في تطبيق الملفات أمر يقابله، والأوامر أسرع حين تعتادها أصابعك. أما نصف الساعة الأخير فلك: أربعة تمارين على الورق، ثم قائمة مهام في آلة أوبونتو الخاصة بك.
نفذ كل أمر في هذه الصفحة على نظام أوبونتو 24.04 حقيقي، بصفة مستخدم عادي اسمه student على حاسوب اسمه ubuntu، والمخرجات (output) المعروضة هي المخرجات الحقيقية. وقوائم مجلدات النظام مثل /usr/share و/etc أطول في تثبيت سطح المكتب الكامل، فستظهر عندك أسماء أكثر؛ أما الأوامر فتعمل بالطريقة نفسها. وكان حساب الاختبار جديدا أيضا، فلم يكن في مجلده الرئيسي المجلدات التي ينشئها سطح المكتب (Desktop وDocuments وغيرهما)؛ أما في آلتك الافتراضية فتعرض كل قائمة لمجلدك الرئيسي هذه الأسماء أيضا. وأنشئت الملفات والمجلدات الجديدة بإعدادات جلسة سطح المكتب، فأذوناتها، مثل -rw-rw-r--، هي نفسها التي ستراها.
الأهداف
بنهاية هذا الدرس ينبغي أن تكون قادرا على:
- فتح طرفية، وقراءة المحث (prompt)، وتقسيم الأمر إلى اسم الأمر والخيارات (options) والوسائط (arguments).
- معرفة مكانك بالأمر
pwd، وعرض محتويات مجلد بالأوامرlsوls -aوls -lوls -la، وقراءة كل عمود في القائمة المطولة (long listing). - التنقل بالأمر
cdباستخدام المسارات المطلقة (absolute) والنسبية (relative)، والرمز..للمجلد الأب، والرمز~أو الأمرcdوحده للمجلد الرئيسي (home folder). - عرض الملفات بالأوامر
less(التمرير والبحث والخروج) وcatوheadوtail. - إنشاء الملفات بالأمر
touch، والمجلدات بالأمرينmkdirوmkdir -p. - النقل وإعادة التسمية بالأمر
mv، والنسخ بالأمرينcpوcp -r، والحذف بالأوامرrmوrm -rوrmdir، مع العلم أنه لا يوجد تراجع. - تحرير ملف نصي صغير بالمحرر
nano، والبحث داخل الملفات وفي مخرجات الأوامر بالأمرينgrepوgrep -i.
الجزء 1: الطرفية
فتح طرفية
الطرفية تطبيق مثل أي تطبيق آخر. اضغط مفتاح Super (مفتاح ويندوز)، واكتب terminal، ثم اضغط Enter. وإذا كنت أضفت الطرفية إلى شريط التطبيقات (dock) في الدرس العملي 8 فنقرة واحدة تفتحها. فتظهر نافذة فيها سطر واحد ينتظرك:
student@ubuntu:~$هذا السطر هو المحث. وهو يخبرك بثلاثة أشياء قبل أن تكتب أي شيء:
| الجزء | المعنى |
|---|---|
student | المستخدم الذي سجلت الدخول به |
ubuntu | اسم الحاسوب |
~ | المجلد الذي أنت فيه الآن؛ و~ اختصار مجلدك الرئيسي |
ويحدد الرمز $ في النهاية الموضع الذي يبدأ منه أمرك. اكتب أمرا واضغط Enter، فتظهر المخرجات تحته، ثم محث جديد. ويظل المحث يعرض مجلدك الحالي، فإذا انتقلت إلى مكان آخر تغير، مثلا إلى student@ubuntu:/usr/share$.
شكل الأمر
لكل أمر في هذا الدرس الشكل نفسه: اسم الأمر (command name)، ثم صفر أو أكثر من الخيارات، ثم صفر أو أكثر من الوسائط.
| المثال | الأمر | الخيارات | الوسائط |
|---|---|---|---|
pwd | pwd | لا يوجد | لا يوجد |
ls -l | ls | -l (مخرجات مطولة) | لا يوجد |
mkdir -p some/other/directories | mkdir | -p (إنشاء المجلدات الأب) | المسار المطلوب إنشاؤه |
cp -r some again | cp | -r (تكراري، recursive) | مصدر ووجهة |
- يبدأ الخيار بشرطة، ويغير طريقة عمل الأمر.
- يكون الوسيط عادة اسم ملف أو مجلد، أو مسارا.
- يمكن دمج الخيارات: فالأمر
ls -laيعني ما يعنيهls -l -a.
شجرة واحدة من المجلدات
يحفظ لينكس كل ملف وكل مجلد في شجرة واحدة. ويسمى أعلى الشجرة المجلد الجذر (root directory)، ويكتب شرطة مائلة واحدة /. ويقع المجلد الرئيسي لكل مستخدم داخل /home، فالمجلد الرئيسي للمستخدم student هو /home/student. ومجلدك الرئيسي هو المكان الذي تملك فيه التحكم الكامل: يمكنك أن تنشئ فيه أي شيء وتغيره وتحذفه. أما معظم باقي الشجرة فيخص النظام، ويستطيع المستخدم العادي قراءته لكنه لا يستطيع تغييره.
/ the root: top of the tree
|-- etc configuration files
|-- home
| `-- student the home folder of student (~)
`-- usr
`-- share
`-- localeالجزء 2: أين أنا؟ pwd وls وcd
pwd: طباعة مجلد العمل الحالي
عندما تفتح طرفية تجد نفسك في مجلدك الرئيسي. ويطبع pwd المجلد الذي أنت فيه الآن، مسارا كاملا من الجذر:
student@ubuntu:~$ pwd
/home/studentاقرأ الإجابة من اليسار إلى اليمين: داخل / يوجد home، وداخل home يوجد student. ومعرفة مكانك هي مفتاح معرفة وجهتك التالية.
ls: عرض محتويات مجلد
يعرض ls الملفات والمجلدات الموجودة داخل المجلد الحالي مرتبة حسب الاسم. وفي المجلد الرئيسي في آلتك الافتراضية يعرض المجلدات التي أنشأها سطح المكتب:
student@ubuntu:~$ ls
Desktop Documents Downloads Music Pictures Public snap Templates Videosويحفظ المجلد snap بيانات التطبيقات المثبتة بصيغة snap، مثل Firefox. وكان حساب الاختبار المستخدم في هذه الصفحة جديدا لا يحوي أيا من هذه المجلدات، فلم يطبع ls فيه أي شيء. وعدم طباعة أي شيء إجابة عادية ناجحة: فببساطة لا يوجد شيء ظاهر لعرضه. وتذكر أن قوائم مجلدك الرئيسي أنت تعرض هذه الأسماء التسعة أيضا. والمجلد /usr/share أكثر ازدحاما. ينقلك الأمر الأول أدناه إليه (وتشرح الصفحات التالية الأمر cd)، ثم يعرض ls محتوياته في أعمدة مرتبة حسب الاسم:
student@ubuntu:~$ cd /usr/share
student@ubuntu:/usr/share$ ls
apport dot.profile locale polkit-1
base-files dot.profile.md5sums locales profile
base-passwd dpkg man profile.md5sums
bash-completion gcc menu sensible-utils
bug gdb misc staff-group-for-usr-local
common-licenses i18n motd tabset
debconf info nano terminfo
debianutils info.dir networks util-linux
dict keyrings pam zoneinfo
doc libc-bin pam-configs
doc-base libgcrypt20 perl5
dot.bashrc lintian pixmapsls -a: عرض الملفات المخفية أيضا
رأيت في الدرس العملي 8 أن الاسم الذي يبدأ بنقطة يكون مخفيا في تطبيق الملفات. ويخفي ls هذه الأسماء أيضا، ويعرضها الخيار -a (all، أي الكل):
student@ubuntu:~$ ls -a
. .. .bash_logout .bashrc .profileفحتى المجلد الرئيسي للحساب الجديد، الذي عرضه ls فارغا، يحوي ثلاثة ملفات مخفية. وهي ملفات إعدادات (configuration files) للصدفة (shell)، وإخفاء ملفات الإعدادات بنقطة في أول الاسم أمر شائع جدا. وفي آلتك الافتراضية يعرض ls -a أيضا مجلدات سطح المكتب التسعة وعناصر مخفية أخرى أنشأها سطح المكتب، مثل .cache و.config. أما الاسمان الباقيان فخاصان:
.(نقطة واحدة) تعني هذا المجلد، أي المجلد الحالي (current directory)...(نقطتان) تعني المجلد الأب (parent folder)، أي المجلد الذي يحوي هذا المجلد.
وهما ليسا ملفين حقيقيين؛ بل طريقتان مدمجتان للإشارة إلى المجلدات القريبة، وستستخدمهما مع cd وmv وcp.
ls -l: القائمة المطولة
يطبع الخيار -l (long، أي المطول) سطرا واحدا لكل عنصر مع تفاصيل إضافية. وهذا مجلد رئيسي يحوي ثلاثة ملفات فارغة ومجلدين:
student@ubuntu:~$ ls -l
total 8
-rw-rw-r-- 1 student student 0 Sep 25 11:07 file1
-rw-rw-r-- 1 student student 0 Sep 25 11:07 file2
-rw-rw-r-- 1 student student 0 Sep 25 11:07 file3
drwxrwxr-x 3 student student 4096 Sep 25 11:08 some
drwxrwxr-x 3 student student 4096 Sep 25 11:08 testاقرأ كل سطر من اليسار إلى اليمين:
| العمود | مثال | المعنى |
|---|---|---|
| النوع والأذونات | drwxrwxr-x | الحرف الأول هو النوع: d للمجلد، و- للملف العادي؛ والباقي هو الأذونات (permissions)، ونتناولها لاحقا في المقرر |
| الروابط | 3 | عدد الروابط الصلبة (hard links) لهذا العنصر |
| المالك | student | المستخدم الذي يملك العنصر |
| المجموعة | student | المجموعة التي تملك العنصر |
| الحجم | 4096 | الحجم بالبايت؛ والملفات الثلاثة الجديدة فارغة، فحجمها 0 |
| وقت التعديل | Sep 25 11:08 | آخر وقت تغير فيه العنصر |
| الاسم | some | اسم الملف أو المجلد |
ويمكن دمج الخيارات، فالأمر ls -la يعطي القائمة المطولة شاملة العناصر المخفية.
مثال محلول 1: اقرأ سطرا من القائمة المطولة
السؤال. بعد بعض التعديلات يطبع ls -l file1 السطر التالي. هل file1 ملف أم مجلد، ومن يملكه، وما حجمه، ومتى تغير آخر مرة؟
-rw-rw-r-- 1 student student 46 Sep 25 11:10 file1الإجابة. الحرف الأول -، فهو ملف عادي. ومالكه student (والمجموعة أيضا student). وحجمه 46 بايتا، وآخر تعديل له كان في 25 سبتمبر الساعة 11:10.
cd: تغيير المجلد بمسار مطلق
ينقلك cd إلى مجلد آخر. وقد استخدم الانتقال إلى /usr/share أعلاه مسارا مطلقا: وهو مسار يبدأ بالرمز / ويصف الموقع ابتداء من الجذر. ولأنه يبدأ من أعلى الشجرة فالمسار المطلق يدل على المجلد نفسه أينما كنت عندما تكتبه. وكل مسار مطلق يبدأ بتلك الشرطة المائلة.
student@ubuntu:~$ cd /usr/share
student@ubuntu:/usr/share$ pwd
/usr/shareلاحظ أن cd نفسه لا يطبع شيئا عندما ينجح؛ بل يتغير المحث ليعرض المجلد الجديد.
cd بمسار نسبي
ليس في المسار النسبي شرطة مائلة في أوله. وهو يصف موقعا ابتداء من المجلد الذي أنت فيه الآن. ويمكن الوصول إلى أي مجلد داخل المجلد الحالي باسمه وحده، ويمكنك النزول عدة مستويات دفعة واحدة بكتابة باقي المسار:
student@ubuntu:/usr/share$ cd locale
student@ubuntu:/usr/share/locale$ cd ar/LC_MESSAGES
student@ubuntu:/usr/share/locale/ar/LC_MESSAGES$ pwd
/usr/share/locale/ar/LC_MESSAGESنجح cd locale فقط لأن locale موجود داخل /usr/share، حيث كنا نقف. والأمر نفسه يفشل إذا كتبته في مجلدك الرئيسي، لأن المجلد الرئيسي لا يحوي locale.
| المسار المطلق | المسار النسبي | |
|---|---|---|
| البداية | / | اسم، أو . أو .. |
| يقاس من | الجذر / | المجلد الحالي |
| مثال | /usr/share/locale | locale (من /usr/share) |
| يعمل من أي مكان؟ | نعم | لا، فهو يعتمد على مكانك |
الصعود إلى الأعلى، والعودة إلى المجلد الرئيسي
استخدم الرمز الخاص .. للصعود إلى المجلد الأب للمجلد الحالي:
student@ubuntu:/usr/share/locale/ar/LC_MESSAGES$ cd ..
student@ubuntu:/usr/share/locale/ar$ pwd
/usr/share/locale/arوللعودة إلى مجلدك الرئيسي من أي مكان، اكتب cd دون وسيط. والتلدة ~ (tilde) تمثل مجلدك الرئيسي في أي أمر، فالأمر cd ~ يفعل الشيء نفسه، وكذلك المسار المطلق الكامل cd /home/student:
student@ubuntu:/usr/share/locale/ar$ cd
student@ubuntu:~$ pwd
/home/student
student@ubuntu:~$ cd /etc
student@ubuntu:/etc$ pwd
/etc
student@ubuntu:/etc$ cd ~
student@ubuntu:~$ pwd
/home/studentوالمجلد /etc هو المكان الذي تحفظ فيه معظم ملفات إعدادات النظام.
مثال محلول 2: مستويان إلى الأعلى
السؤال. أنت في /usr/share/locale/ar/LC_MESSAGES وتكتب cd ../... أين أنت الآن؟
الإجابة. كل .. يصعد مستوى واحدا، والشرطة المائلة بينهما تربط الانتقالين: فأول .. ينقلك إلى /usr/share/locale/ar، وثانيهما إلى /usr/share/locale.
student@ubuntu:~$ cd /usr/share/locale/ar/LC_MESSAGES
student@ubuntu:/usr/share/locale/ar/LC_MESSAGES$ cd ../..
student@ubuntu:/usr/share/locale$ pwd
/usr/share/localeمثال محلول 3: عندما يفشل cd
السؤال. في مجلدك الرئيسي تكتب cd nothere، ولا يوجد مجلد بهذا الاسم. ماذا يحدث؟
الإجابة. تطبع الصدفة رسالة خطأ وتبقى حيث كنت؛ ويظل المحث يعرض ~.
student@ubuntu:~$ cd nothere
bash: cd: nothere: No such file or directory
student@ubuntu:~$اقرأ رسائل الخطأ من اليسار إلى اليمين: البرنامج الذي اعترض (bash، أي الصدفة)، ثم الأمر (cd)، ثم الاسم الذي أعطي له، ثم السبب.
تفاعلي: تتبع مسار خطوة بخطوة
اختر مجلد بداية واكتب مسارا بعد cd (أو اضغط أحد الأمثلة)، ثم اضغط تشغيل أو خطوة. فيسير المؤشر في الشجرة جزءا بعد جزء من المسار: يبدأ المسار المطلق من /، ويبدأ المسار النسبي من مكانك، وتنقلك ~ إلى المجلد الرئيسي، ويصعد .. مستوى واحدا، ويبقيك . في مكانك. والمجلد الأخير هو ما يطبعه pwd بعد cd. وإذا فشل أي جزء من المسار فشل cd كله وبقيت في المجلد الذي بدأت منه. وتحوي الأداة أسماء المجلدات الحقيقية لنظام الاختبار، وإجاباتها هي التي أعطاها bash للأوامر نفسها.
الجزء 3: قراءة محتوى الملفات
يحفظ لينكس جزءا كبيرا من النظام في ملفات نصية عادية (plain text files)، ولذلك فقراءة الملفات مهمة يومية.
less: عارض الصفحات
الأمر less عارض صفحات (pager): يفتح ملفا ويعرض منه شاشة واحدة في كل مرة. وعلى خلاف الأوامر السابقة لا يعود إلى المحث فورا: بل يظل يعمل ويشغل الطرفية حتى تخرج منه. افتح الملف /etc/services، وهو ملف إعدادات يسرد خدمات الشبكة التي يعرفها النظام:
student@ubuntu:~$ less /etc/servicesيملأ أول الملف النافذة، ويعرض السطر الأخير اسم الملف:
# Network services, Internet style
#
# Updated from https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml .
#
# New ports will be added on request if they have been officially assigned
# by IANA and used in the real-world or are needed by a debian package.
# If you need a huge list of used numbers please install the nmap package.
tcpmux 1/tcp # TCP port service multiplexer
echo 7/tcp
echo 7/udp
discard 9/tcp sink null
discard 9/udp sink null
systat 11/tcp users
daytime 13/tcp
daytime 13/udp
netstat 15/tcp
qotd 17/tcp quote
chargen 19/tcp ttytst source
chargen 19/udp ttytst source
ftp-data 20/tcp
ftp 21/tcp
/etc/servicesالمفاتيح داخل less:
| المفتاح | الإجراء |
|---|---|
| سهما الأعلى والأسفل | التمرير سطرا واحدا |
Space أو Page Down أو Ctrl+f | صفحة واحدة إلى الأسفل |
Page Up أو Ctrl+b | صفحة واحدة إلى الأعلى |
/ ثم كلمة، ثم Enter | البحث عن الكلمة إلى الأمام |
n / N | التطابق التالي / التطابق السابق |
q | الخروج والعودة إلى المحث |
مثال محلول 4: البحث داخل less
السؤال. داخل less /etc/services تكتب /mail وتضغط Enter. أي سطر يقفز إلى أعلى الشاشة؟ ثم تضغط n. أين تصل؟
الإجابة. يتقدم البحث إلى أول سطر يحوي mail ويضعه في أعلى الشاشة. وهو خدمة SMTP (البريد) على المنفذ (port) 25:
smtp 25/tcp mail
time 37/tcp timserver
time 37/udp timserver
whois 43/tcp nicnameوالضغط على n ينقلك إلى التطابق التالي، في موضع أبعد من الملف:
mailq 174/tcp # Mailer transport queue for Zmailer
xdmcp 177/udp # X Display Manager Control Protocol
bgp 179/tcp # Border Gateway Protocolوبينما ينتظر less مفتاحا بعد البحث، يعرض سطره الأخير نقطتين رأسيتين : بدلا من اسم الملف. اضغط q للخروج.
cat وhead وtail
ثلاثة أوامر تطبع الملف وتعود إلى المحث فورا:
| الأمر | يطبع |
|---|---|
cat file | الملف كله |
head file | أول 10 أسطر |
tail file | آخر 10 أسطر |
وفي ملف طويل مثل /etc/services يكون head وtail أنفع بكثير من cat:
student@ubuntu:~$ head /etc/services
# Network services, Internet style
#
# Updated from https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml .
#
# New ports will be added on request if they have been officially assigned
# by IANA and used in the real-world or are needed by a debian package.
# If you need a huge list of used numbers please install the nmap package.
tcpmux 1/tcp # TCP port service multiplexer
echo 7/tcpstudent@ubuntu:~$ tail /etc/services
sgi-cad 17004/tcp # Cluster Admin daemon
binkp 24554/tcp # binkp fidonet protocol
asp 27374/tcp # Address Search Protocol
asp 27374/udp
csync2 30865/tcp # cluster synchronization tool
dircproxy 57000/tcp # Detachable IRC Proxy
tfido 60177/tcp # fidonet EMSI over telnet
fido 60179/tcp # fidonet EMSI over TCP
# Local servicesعد أسطر المخرجات في كل حالة: 10 أسطر بالضبط، والسطر الفارغ يحسب واحدا منها. والملف الأقصر من 10 أسطر يطبعه الأمران كاملا.
الجزء 4: إنشاء الملفات والمجلدات
تعمل الأجزاء التالية في المجلد الرئيسي، وهو المكان الوحيد الذي تضمن أن لديك فيه إذنا بإنشاء الملفات.
touch: إنشاء ملف فارغ
أبسط طريقة لإنشاء ملف هي touch. فهو ينشئ ملفا فارغا بالاسم الذي تعطيه. ويمكنك إعطاؤه عدة أسماء دفعة واحدة، وتعمل المسارات المطلقة أيضا:
student@ubuntu:~$ cd
student@ubuntu:~$ touch file1
student@ubuntu:~$ ls
file1
student@ubuntu:~$ touch /home/student/file2 /home/student/file3
student@ubuntu:~$ ls
file1 file2 file3مثال محلول 5: touch على ملف موجود
السؤال. الملف file3 موجود من قبل. وبعد بضع دقائق تشغل touch file3 مرة أخرى. هل ينشئ ملفا ثانيا باسم file3، أم يفرغ الملف، أم يفعل شيئا آخر؟
الإجابة. لا يمكن أن يشترك عنصران في مجلد واحد في اسم واحد، فلا يوجد ملف ثان. وعلى ملف موجود لا يفعل touch إلا أن يحدث وقت آخر تعديل له. وتظهر ذلك القائمة المطولة قبل التشغيل وبعده:
student@ubuntu:~$ ls -l file3
-rw-rw-r-- 1 student student 0 Sep 25 11:07 file3
student@ubuntu:~$ touch file3
student@ubuntu:~$ ls -l file3
-rw-rw-r-- 1 student student 0 Sep 25 11:10 file3mkdir: إنشاء مجلد
ينشئ mkdir مجلدا فارغا. ويمكن إنشاء مجلد داخل مجلد آخر موجود من قبل:
student@ubuntu:~$ mkdir test
student@ubuntu:~$ mkdir test/exampleمثال محلول 6: مسار مجلداته الأب غير موجودة
السؤال. لا يوجد بعد مجلد اسمه some. ماذا يفعل mkdir some/other/directories؟
الإجابة. يفشل: فالأمر mkdir لا ينشئ إلا المجلد الأخير في المسار، ويحتاج إلى أن تكون المجلدات التي قبله موجودة من قبل.
student@ubuntu:~$ mkdir some/other/directories
mkdir: cannot create directory 'some/other/directories': No such file or directory(ترسم طرفيتك علامتي الاقتباس حول الاسم في هذه الرسالة منحنيتين.) ويطلب الخيار -p (parents، أي المجلدات الأب) من mkdir أن ينشئ كل مجلد ناقص على طول المسار في خطوة واحدة: أولا some، ثم other داخله، ثم directories داخل ذلك.
student@ubuntu:~$ mkdir -p some/other/directories
student@ubuntu:~$ ls
file1 file2 file3 some testوالقائمة المطولة لهذا المجلد هي التي قرأناها في الجزء 2: فالعنصران some وtest مجلدان (d)، ولكل منهما 3 روابط لأن كلا منهما يحوي بالفعل مجلدا خاصا به.
الجزء 5: النقل والنسخ والحذف
mv: النقل
ينقل mv ملفا إلى موقع جديد. وتقرأ صيغته هكذا: "انقل من هنا إلى هناك":
student@ubuntu:~$ mv file1 test
student@ubuntu:~$ ls
file2 file3 some test
student@ubuntu:~$ ls test
example file1وإعطاء اسم مجلد للأمر ls يعرض ذلك المجلد بدلا من المجلد الحالي. ولإعادة الملف، استخدم اسم النقطة الواحدة الذي يعني "هذا المجلد" وجهة:
student@ubuntu:~$ mv test/file1 .
student@ubuntu:~$ ls
file1 file2 file3 some testmv: إعادة التسمية
النقل وإعادة التسمية عملية واحدة: فكلاهما يغير مكان العنصر واسمه. ونقل العنصر إلى المكان نفسه باسم جديد يعيد تسميته:
student@ubuntu:~$ mv test testing
student@ubuntu:~$ ls
file1 file2 file3 some testingتحذير. لا تمنعك الصدفة من إتلاف الملفات عن طريق الخطأ. فإذا أعدت تسمية ملف إلى اسم موجود من قبل، يستبدل الملف القديم بالملف الذي نقلته، ولا توجد طريقة لاستعادته.
cp: نسخ ملف
لا يستطيع mv أن يكرر شيئا؛ أما cp فيصنع نسخة جديدة ويبقي الأصل. وهو يستخدم ترتيب "من هنا إلى هناك" نفسه:
student@ubuntu:~$ cp file3 file4
student@ubuntu:~$ ls
file1 file2 file3 file4 some testingبعد mv يختفي اسم المصدر؛ وبعد cp يوجد الاسمان كلاهما. وينطبق تحذير الاستبدال نفسه: فلو كان file4 موجودا من قبل، لاستبدل محتواه كله بمحتوى file3.
مثال محلول 7: نسخ مجلد
السؤال. العنصر some مجلد. ماذا يفعل cp some again؟
الإجابة. لا ينسخ شيء. فالمجلد لا ينسخ إلا بالخيار -r (التكراري)، الذي ينسخ المجلد مع كل ما بداخله:
student@ubuntu:~$ cp some again
cp: -r not specified; omitting directory 'some'
student@ubuntu:~$ cp -r some again
student@ubuntu:~$ ls again
otherالنسخ إلى مجلد موجود
عندما تكون الوجهة مجلدا موجودا، ينسخ الملف إلى داخله بدلا من أن يستبدل أي شيء:
student@ubuntu:~$ cp file1 again
student@ubuntu:~$ ls again
file1 otherويتصرف mv بالطريقة نفسها: فقد نقل mv file1 test سابقا الملف إلى داخل المجلد الموجود test.
rm وrmdir: الحذف
تحذير. لا يوجد تراجع ولا سلة مهملات في الصدفة. والملف الذي تحذفه بالأمر
rmيضيع إلى الأبد.
يحذف rm الملفات. ويحذف rmdir المجلدات الفارغة فقط:
student@ubuntu:~$ rm file4
student@ubuntu:~$ rmdir testing/exampleمثال محلول 8: rmdir على مجلد غير فارغ
السؤال. ما زال some يحوي other/directories. ماذا يفعل rmdir some، وكيف تحذف some مع كل ما بداخله؟
الإجابة. يرفض rmdir، لأن المجلد ليس فارغا:
student@ubuntu:~$ rmdir some
rmdir: failed to remove 'some': Directory not emptyأما rm مع الخيار -r فيحذف كل محتويات المجلد ثم المجلد نفسه، دون أي سؤال. و-R هو الخيار نفسه بحرف كبير:
student@ubuntu:~$ rm -r again
student@ubuntu:~$ ls
file1 file2 file3 some testingrm -i وrm -f
يغير خياران آخران مدى حذر rm:
-i(interactive، أي تفاعلي) يسأل قبل كل حذف. أجبyللحذف، أوnللإبقاء على الملف. وبعض التوزيعات تجعلrmيعمل مثلrm -iافتراضيا، لكن أوبونتو لا تفعل ذلك.-f(force، أي الإجبار) يحذف دون سؤال، ويبقى صامتا حتى عندما لا يوجد الاسم. وهو مريح لحذف ملفات كثيرة، وخطر للسبب نفسه.
في جولة الجزء 7، يحوي المجلد projects الملف الفارغ labs:
student@ubuntu:~/projects$ rm -i labs
rm: remove regular empty file 'labs'? n
student@ubuntu:~/projects$ ls
labs tasklistأبقت الإجابة n على الملف labs.
الجزء 6: التحرير والبحث
nano: محرر نصوص في الطرفية
ينشئ touch ملفات فارغة؛ ولكتابة نص في ملف استخدم محررا. وnano محرر بسيط للمبتدئين. وهو مثل less يشغل الطرفية كلها حتى تخرج منه. افتح (أو أنشئ) file1:
student@ubuntu:~$ nano file1يعرض السطر العلوي اسم البرنامج واسم الملف، ويعرض الوسط النص، ويسرد السطران السفليان الاختصارات. وفي هذه الاختصارات يعني ^ المفتاح Ctrl، فالاختصار ^X هو Ctrl+X. اكتب سطرين:
GNU nano 7.2 file1 *
Hello there.
Here is some text.
^G Help ^O Write Out ^W Where Is ^K Cut ^T Execute ^C Location
^X Exit ^R Read File ^\ Replace ^U Paste ^J Justify ^/ Go To Lineأسقطنا هنا الصفوف الفارغة بين النص والاختصارات. وتعني * بعد اسم الملف أن هناك تغييرات لم تحفظ بعد. والمفاتيح التي تحتاج إليها:
| المفاتيح | الإجراء |
|---|---|
Ctrl+O | الكتابة إلى الملف (الحفظ): يسأل nano File Name to Write: file1؛ اضغط Enter للتأكيد |
Ctrl+X | الخروج؛ وإذا وجدت تغييرات غير محفوظة يسأل Save modified buffer? |
Y / N | عند ذلك السؤال: الحفظ، أو تجاهل التغييرات |
Ctrl+C | إلغاء السؤال والبقاء في المحرر |
Ctrl+G | المساعدة |
وبعد Ctrl+O ثم Enter، يؤكد سطر الحالة [ Wrote 2 lines ]. أضف سطرا ثالثا، Another line.، ثم اضغط Ctrl+X، وأجب Y، ثم Enter عند اسم الملف، فتعود إلى المحث. ويعرض cat النتيجة:
student@ubuntu:~$ cat file1
Hello there.
Here is some text.
Another line.ويعرض less file1 الأسطر الثلاثة نفسها مع file1 (END) في الأسفل، لأن الملف كله يتسع في شاشة واحدة.
مثال محلول 9: ما حجم الملف؟
السؤال. توقع الحجم الذي يعرضه ls -l file1 لهذه الأسطر الثلاثة.
الإجابة. كل حرف هنا بايت واحد، وكل سطر ينتهي بمحرف سطر جديد (newline) غير مرئي يأخذ هو أيضا بايتا واحدا. فالسطر Hello there. فيه 12 حرفا، ومع محرف السطر الجديد يصبح 13 بايتا؛ والسطر Here is some text. فيه 18 حرفا، ومع 1 يصبح 19 بايتا؛ والسطر Another line. فيه 13 حرفا، ومع 1 يصبح 14 بايتا. والمجموع 13 + 19 + 14 = 46:
student@ubuntu:~$ ls -l file1
-rw-rw-r-- 1 student student 46 Sep 25 11:10 file1وهذا هو السطر الذي قرأته في المثال المحلول 1.
grep: البحث داخل ملف
يبحث grep داخل ملف ويطبع كل سطر يحوي جزءا معينا من النص يسمى النمط (pattern). ولا يلزم أن يكون النمط كلمة كاملة. وفي الجولة أدناه يحوي الملف tasklist سطرا واحدا هو Hello World، كتب بالمحرر nano:
student@ubuntu:~/projects$ cat tasklist
Hello World
student@ubuntu:~/projects$ grep ll tasklist
Hello Worldوجد ll داخل Hello، فطبع السطر كله.
مثال محلول 10: الحروف الكبيرة
السؤال. ماذا يطبع grep hello tasklist وgrep -i hello tasklist؟
الإجابة. الأمر grep يميز بين الحروف الكبيرة والصغيرة (case sensitive): فالنص hello ليس هو النص Hello، ولذلك لا يجد الأمر الأول شيئا ولا يطبع شيئا. أما الخيار -i فيجعله يتجاهل حالة الحروف:
student@ubuntu:~/projects$ grep hello tasklist
student@ubuntu:~/projects$ grep -i hello tasklist
Hello Worldgrep على مخرجات أمر آخر
يستطيع grep أيضا أن يبحث في مخرجات أمر آخر. والخط الرأسي | هو الأنبوب (pipe): يرسل مخرجات الأمر الذي على يساره إلى الأمر الذي على يمينه. ولعرض الأسماء التي تحوي net فقط في /etc، بأي حالة للحروف:
student@ubuntu:~/projects$ ls /etc | grep -i net
issue.net
networksفي تثبيت سطح المكتب أسماء مطابقة أكثر في /etc، فستكون قائمتك أطول.
الجزء 7: عشرة أوامر في جلسة واحدة
تستخدم هذه الجولة الأوامر بترتيب منطقي، بالطريقة التي تنظم بها مشروعا حقيقيا. وتبدأ في المجلد الرئيسي لحساب جديد؛ أما في آلتك الافتراضية فمجلدات سطح المكتب موجودة أيضا، ويعرضها كل ls للمجلد الرئيسي.
1. أنشئ المجلدات. مجلد للمشاريع، ومجلد للسنة داخله مجلد للربع الأول (في خطوة واحدة)، ومجلد للموارد:
student@ubuntu:~$ pwd
/home/student
student@ubuntu:~$ mkdir projects
student@ubuntu:~$ mkdir -p 2022/Q1
student@ubuntu:~$ mkdir resources
student@ubuntu:~$ ls
2022 projects resources2. غير رأيك. ما زال resources فارغا، فيحذفه rmdir. وحين يحوي المجلد ملفا يرفض rmdir الحذف ويلزم rm -R:
student@ubuntu:~$ rmdir resources
student@ubuntu:~$ mkdir resources
student@ubuntu:~$ touch resources/notes
student@ubuntu:~$ rmdir resources
rmdir: failed to remove 'resources': Directory not empty
student@ubuntu:~$ rm -R resources
student@ubuntu:~$ ls
2022 projects3. ثلاث طرق للعودة. من /etc، يعيدك المسار المطلق وcd ~ وcd وحده إلى المجلد الرئيسي:
student@ubuntu:~$ cd /etc
student@ubuntu:/etc$ cd /home/student
student@ubuntu:~$ cd /etc
student@ubuntu:/etc$ cd ~
student@ubuntu:~$ cd /etc
student@ubuntu:/etc$ cd
student@ubuntu:~$ pwd
/home/student4. أنشئ ملفات، ومنها ملف مخفي.
student@ubuntu:~$ cd projects
student@ubuntu:~/projects$ touch tasklist
student@ubuntu:~/projects$ touch activities
student@ubuntu:~/projects$ touch content
student@ubuntu:~/projects$ touch .secretfile
student@ubuntu:~/projects$ ls
activities content tasklist
student@ubuntu:~/projects$ ls -a
. .. activities content .secretfile tasklist
student@ubuntu:~/projects$ ls -la
total 8
drwxrwxr-x 2 student student 4096 Sep 25 11:12 .
drwxr-x--- 4 student student 4096 Sep 25 11:11 ..
-rw-rw-r-- 1 student student 0 Sep 25 11:11 activities
-rw-rw-r-- 1 student student 0 Sep 25 11:12 content
-rw-rw-r-- 1 student student 0 Sep 25 11:12 .secretfile
-rw-rw-r-- 1 student student 0 Sep 25 11:11 tasklist5. انقل، وأعد التسمية، وانسخ، واحذف. والتلدة تختصر الكتابة في cp وmv أيضا:
student@ubuntu:~/projects$ mv content /home/student/2022
student@ubuntu:~/projects$ ls /home/student/2022
content Q1
student@ubuntu:~/projects$ mv activities labs
student@ubuntu:~/projects$ ls
labs tasklist
student@ubuntu:~/projects$ cp tasklist ~/2022/Q1
student@ubuntu:~/projects$ ls ~/2022/Q1
tasklist
student@ubuntu:~/projects$ rm .secretfile
student@ubuntu:~/projects$ ls -a
. .. labs tasklistفي النهاية يحوي projects الملفين labs وtasklist، ويحوي 2022 الملف content والمجلد Q1، ويحوي Q1 نسخة من tasklist. وقبل أن تغير ملفا مهما، من العادات الجيدة أن تنسخه أولا نسخة احتياطية، كما فعلنا هنا تماما.
تفاعلي: الطرفية التجريبية
الأداة أدناه طرفية صغيرة متصلة بنظام أوبونتو محاكى فيه مجلد رئيسي جديد. اكتب أي أمر من هذا الدرس (pwd وls وcd وmkdir وtouch وcp وmv وrm وrmdir وcat وhead وtail وless وnano وgrep) وراقب شجرة المجلدات بجانبها وهي تتحدث: تومض العناصر الجديدة باللون الأخضر، وتتلاشى العناصر المحذوفة باللون الأحمر، ويظلل مجلدك الحالي. ويشرح مربع تحت الشجرة بكلمات بسيطة ما فعله الأمر الأخير.
اختر سيناريو ("جلسة واحدة، عشرة أوامر": الجولة أعلاه؛ أو "إدارة الملفات والمجلدات": أوامر الجزأين 4 و5؛ أو "أين أنا؟ التنقل بين المجلدات": تنقلات الجزء 2): فيشغله زر تشغيل أمرا بعد أمر، ويشغل زر خطوة الأمر التالي فقط، ويبدأ زر إعادة من جديد بمجلد رئيسي جديد. والمخرجات ورسائل الخطأ هي نفسها التي طبعتها الطرفية الحقيقية للأوامر نفسها (مع علامات اقتباس مستقيمة). وكل ما لا تحاكيه البيئة التجريبية (sandbox)، مثل خيار لا يدرسه هذا الدرس، يظهر له سطر رمادي يبدأ بعبارة "البيئة التجريبية:"، وهي المقابلة لعبارة sandbox: في النسخة الإنجليزية.
تمارين
نحو 30 دقيقة. التمارين من 1 إلى 4 على الورق (والإجابات في النهاية). والتمرين 5 ينفذ في طرفية آلة أوبونتو الافتراضية الخاصة بك. وقد تحققنا من كل إجابة أدناه بتشغيل الأوامر.
التمرين 1: تتبع المحث
تبدأ في مجلدك الرئيسي /home/student. اكتب ما يطبعه كل pwd.
cd /usr/share
cd locale/ar
cd ..
pwd
cd ../..
pwd
cd
pwdالتمرين 2: ارسم الشجرة
في مجلدك الرئيسي تشغل الأوامر أدناه بالترتيب. ارسم الشجرة النهائية للمجلد lab9: كل مجلد وكل ملف.
mkdir lab9
cd lab9
mkdir -p notes/week9
touch a.txt b.txt
mv a.txt notes
cp b.txt notes/week9
mv b.txt c.txt
cp -r notes backup
rm notes/a.txtالتمرين 3: توقع الخطأ
ما زلت داخل lab9 بعد التمرين 2. كل أمر أدناه يفشل. اذكر السبب، والأمر الذي كان سينجز المهمة.
rmdir backupcp notes copymkdir x/ycd c.txtrm backup
التمرين 4: اكتب الأمر
اكتب أمرا واحدا لكل مهمة.
- أعد تسمية
draft.txtإلىfinal.txt. - أنشئ المجلد
reports/2026/sepحين لا يوجد حتىreports. - اصنع نسخة كاملة من المجلد
siteباسمsite-backup. - أنت في
~/lab9/reports/2026. اصعد إلى~/lab9/reports. - اعرض كل شيء في المجلد الحالي، ومعه العناصر المخفية، بالتنسيق المطول.
- اطبع أسطر
todoالتي تحويfinish، سواء كتبتfinishأوFinish.
التمرين 5: تطبيق عملي في آلتك الافتراضية
افتح طرفية ونفذ كل مهمة، متحققا من كل خطوة بالأمر ls أو pwd:
- شغل
pwd، ثمls -aفي مجلدك الرئيسي. ما الملفات المخفية الموجودة عندك؟ - أنشئ
lab9/notes/week9بأمر واحد، ثم أنشئ الملفين الفارغينa.txtوb.txtداخلlab9. - داخل
lab9، شغل باقي أوامر التمرين 2، منmv a.txt notesإلىrm notes/a.txt، وقارن ما يعرضهlsبرسمك. - عد إلى مجلدك الرئيسي. وبالمحرر
nanoأنشئ هناك الملفtodoبالأسطر الأربعةbuy milkوFinish OS labوbook the labوfinish report. احفظ واخرج. - شغل
grep finish todo، ثمgrep -i finish todo، ثمgrep lab todo. اشرح كل سطر من المخرجات. - افتح
/etc/servicesبالأمرless، وابحث عنhttp، واضغطnمرتين، ثم اخرج. - احذف المجلد
lab9كله والملفtodo، وتأكد بالأمرlsأن كليهما اختفى.
الإجابات
التمرين 1
ينزل cd locale/ar مستويين إلى /usr/share/locale/ar، ويصعد cd .. مستوى واحدا:
student@ubuntu:/usr/share/locale$ pwd
/usr/share/locale
student@ubuntu:/usr/share/locale$ cd ../..
student@ubuntu:/usr$ pwd
/usr
student@ubuntu:/usr$ cd
student@ubuntu:~$ pwd
/home/studentالأمر pwd الثاني يطبع /usr: مستويان فوق /usr/share/locale. والأخير يطبع المجلد الرئيسي، لأن cd دون وسيط يذهب دائما إلى المجلد الرئيسي.
التمرين 2
lab9
|-- backup
| |-- a.txt
| `-- week9
| `-- b.txt
|-- c.txt
`-- notes
`-- week9
`-- b.txtخطوة بخطوة: ينتقل a.txt إلى notes؛ وتذهب نسخة من b.txt إلى notes/week9؛ وتعاد تسمية الأصل b.txt إلى c.txt؛ ويصبح backup نسخة كاملة من notes بينما ما زال يحوي a.txt؛ وأخيرا يحذف a.txt من notes وحده، فتبقى النسخة في backup. والقوائم الحقيقية:
student@ubuntu:~/lab9$ ls
backup c.txt notes
student@ubuntu:~/lab9$ ls notes
week9
student@ubuntu:~/lab9$ ls notes/week9
b.txt
student@ubuntu:~/lab9$ ls backup
a.txt week9
student@ubuntu:~/lab9$ ls backup/week9
b.txtالتمرين 3
student@ubuntu:~/lab9$ rmdir backup
rmdir: failed to remove 'backup': Directory not empty
student@ubuntu:~/lab9$ cp notes copy
cp: -r not specified; omitting directory 'notes'
student@ubuntu:~/lab9$ mkdir x/y
mkdir: cannot create directory 'x/y': No such file or directory
student@ubuntu:~/lab9$ cd c.txt
bash: cd: c.txt: Not a directory
student@ubuntu:~/lab9$ rm backup
rm: cannot remove 'backup': Is a directory- المجلد
backupليس فارغا؛ وrmdirلا يحذف إلا المجلدات الفارغة. استخدمrm -r backup. - العنصر
notesمجلد؛ ونسخ المجلد يحتاج إلى-r. استخدمcp -r notes copy. - المجلد الأب
xغير موجود. استخدمmkdir -p x/y. - العنصر
c.txtملف، وcdلا يدخل إلا المجلدات. ولقراءة الملف استخدمcat c.txt(وهو فارغ، فلا يطبع شيء). - الأمر
rmوحده لا يحذف المجلدات. استخدمrm -r backup.
التمرين 4
mv draft.txt final.txtmkdir -p reports/2026/sepcp -r site site-backupcd ..ls -la(أوls -al، أوls -l -a)grep -i finish todo
عند تشغيلها في lab9 تعطي الإجابات ما يلي:
student@ubuntu:~/lab9$ ls
backup c.txt final.txt notes reports site site-backup
student@ubuntu:~/lab9$ cd reports/2026
student@ubuntu:~/lab9/reports/2026$ cd ..
student@ubuntu:~/lab9/reports$ pwd
/home/student/lab9/reportsالتمرين 5
المهمة 1: يعرض الحساب الجديد .bash_logout و.bashrc و.profile، إضافة إلى الاسمين الخاصين . و... وفي آلتك الافتراضية أضاف سطح المكتب عناصر مخفية أخرى، مثل .cache و.config، وتظهر أيضا مجلدات سطح المكتب التسعة. وتضيف البرامج عناصرها كذلك: ففي حساب الاختبار أنشأ less وnano العنصرين .lesshst و.local لحفظ سجلهما. وقد أظهر حساب الاختبار المستخدم في هذه الصفحة، بعد جولة الجزء 7 والمهمة 4:
student@ubuntu:~$ ls -a
. .. 2022 .bash_logout .bashrc .lesshst .local .profile projects todoالمهمة 5 تطبع:
student@ubuntu:~$ grep finish todo
finish report
student@ubuntu:~$ grep -i finish todo
Finish OS lab
finish report
student@ubuntu:~$ grep lab todo
Finish OS lab
book the labيطابق الأمر الأول finish بالحروف الصغيرة فقط؛ ويقبل -i أيضا Finish؛ ويظهر lab في سطرين. والمهمة 7 هي rm -r lab9 ثم rm todo في مجلدك الرئيسي، وبعدها لا يعرض ls أيا منهما.