مقدمة عن أنواع الشيل وبعض الأوامر الهامة فى لينوكس

Arabian Penguin

مشرف سابق
بسم الله الرحمن الرحيم

أنواع الShell الموجودة فى نظام التشغيل
LINUX
مقدمة

قبل أن نتحدث عن انواع الShell الموجودة فى اللينوكس يجب علينا أولا أن نفهم ما هو الShell .

مفهوم ال Shell :
الshell هو برنامج يقوم بالوساطة بينك وبين اللينوكس أو بالتحديد بين المستخدم وبين نواة اللينوكس
والتى تسمى الكيرنل (Kernel) حيث يقوم ال Shell بتفسير ما تقوم بكتابته فى ال prompt ويقوم تمريره الى النواة (Kernel).

ويمكن اعتبار ال Shell على أنه مفسر لغة أوامر Command Language Interpreter كما أنه يحتوى على العديد من الأوامر Commands الخاصة به ويمكنه أيضا الأستفادة من الملحقات والبرامج الموجودة فى اللينوكس ( سنوضح ذلك فيما بعد) .

أين أكتب اوامر الشيل ؟
يجب أولا ان تفرق بين برنامجيين الأول يسمى Shell والآخر يسمى Terminal .
فالShell هو مانتحدث عنه أما ال Terminal فهو البرنامج الذى يقوم بتوفير واجهة لكى تكتب فيها أوامر ال Shell ويقوم هو بتمريرها الى الShell . ويوجد أكثر من برنامج للتيرمنال Terminal مثل Konsole , Eterm ,Aterm ,…………… والعديد من البرامج الأخرى ويمكنك استخدام ما يروق لك
منها .

وكما ذكرنا سابقا أن الShell يقوم بتفسير الأوامر فعلى سبيل المثال اذا قمت بكتابة الأمر التالى :
( اذا كنت لا تعرف أين تكتب الأوامر ارجع الى المقدمة )
Rich (BB code):
[ahmed@localhost ahmed]$ pwd
/home/ahmed
[ahmed@localhost ahmed]$
لقد قمت بكتابة الأمر pwd وهو اختصار ل print working directory وهو يقوم بطبع المجلد (المسار) الحالى الذى تقف عليه .
ما أريده هنا هو أن أوضح لك أن الأمر pwd أمر مبنى فى اللينوكس باش شيل (Linux bash Shell) .
لكن هناك أوامر مثل cp وهو اختصار ل copy أو rm وهو اختصار ل remove فهذان الأمران يعتبران برامج تنفيذية منفصلة وموجودة فى أحد المجلدات الخاصة بنظام ملفات اللينوكس مثل /usr/bin/ .
أرجو الا تكون قد حدث لك شيئا من التداخل و للتوضيح أكثر :

سأشرح لك المراحل التى يقوم بها ال Shell لكى يقوم بتنفيذ الأمر الذى نفذه المستخدم :
-1 أولا يقوم الشيل بفحص الأمر لكى يتأكد اذا ما كان أحد الاوامر التى المبنية فيه وإن لم يجده يقوم بالتأكد من أن الأمر أحد البرامج التطبيقية ( والبرامج التطبيقية ربما تكون أحد البرامج الموجودة فى النظام مثل الأمر ls أو rm . أو ربما يكون أحد البرامج التى تكون قد ثبتها فى النظام مؤخرا ) حيث يقوم بالبحث عن هذه البرامج التطبيقية فى المجلدات الموجودة فى مسار الشيل ( ستتعلم لاحقا كيفية اضافة البرامج الى مسار الشيل . وإن لم يجده أيضا فى البرامج التطبيقية يقوم الشيل بإظهار رسالة تفيد بإن الأمر خاطىء أو اظهار رسالة خطأ .

ويجدر بنا الأشارة هنا إلى أن الShell له ميزة أخرى وهى أنه يحتوى على لغة تفسيرية قوية جدا .وهذه اللغة تحتوى على العديد من الوظائف والأمكانيات كالتى توجد فى لغات المستوى المتقدم High level Language مثل Functions ,looping ,arrays and variables .

ويوجد سؤال هنا يجب أن نجيب عليه وهو كيف يبدأ الShell فى العمل ؟؟؟

والإجابة هى أن الShell يقوم بالعمل بعد أن تدخل الى النظام بنجاح Logged into the System ويظل الشيل هو الوسيلة الرئيسية بينك وبين نواة النظام حتى تخرج من النظام .

وكما يظهر عنوان هذه المقالة ( أو سمها كما تشاء ) يتضح أن هناك أنواع ل Shell ولكل مستخدم وجهة نظره الشخصية لذلك يمكنك اختيار أى نوع من الShell كما تشاء ولذلك اذا فرضنا أن لديك أكثر من مستخدم لجهازك فكل مستخدم لديه Shell أفتراضى خاص به ويخرن هذا الشيل الأفتراضى لكل المستخدمين فى ملف اسمه System password file أو /etc/passwd/ ويحتوى هذا الملف أيضا على الID لكل المستخدمين باإضافة الى نسخة مشفرة لكلمة السر واسم البرنامج الذى يعمل تلقائيا بعد الدخول الى النظام .
والآن نأتى الى الموضوع الرئيسيى وهو أنواع الShell :

يوجد العديد من برامج الShell المختلفة سواء كان ذلك فى نظام التشفيل UNIX أو أخونا LINUX .

ومن هذا البرامج Bourne Shell ويعرف اختصارا بإسم (sh) ويوجد أيضا C Shell ويختصر ب (csh) و يوجد ال Korn Shell ويختصر ب (ksh) ولكل من هذه البرامج المزايا والعيوب على حد سواء :

-1 Bourne Shell تمت كتابته بواسطة رجل يدعى Steven Bourne وهو الشيل الأصلى الخاص بالUNIX وموجود فى كل أنظمة ال UNIX ويعتبر أفضل الShells فى الShell programming لكنه لايوفر تفاعلا بين المستخدم والنظام كما يفعل غيره من ال Shells .
-2 C Shell كتب بواسطة Bill Joy وهو أكثر تفاعلا مع المستخدم من سابقه ولكن يعتقد الكثير أن الواجهة البرمجية له programming Interface ليست بالقوة والجدارة مثل الموجودة فى Bourne Shell
ولكن الكثير من مبرمجى لغة ال C يفضلونه لأن الSyntax ل Programming Language الخاصة به قريب من لغة ال C . ولذلك سمى ب C Shell .
Korn Shell-3 تمت كتابته بواسطة Dave Korn وقام هذا الرجل بعمل شىء رائع جدا فقد قام بجمع المزايا الموجودة فى كلا من ال csh و الbourne shell وقام بجمعهم فى شىء واحد متوافق مع ال Bourne Shell يتمتع بالتفاعل والقوة وقوة واجهته البرمجية .

ويمكن اعتبار الثلاث Shells السابقة هم الأساس ( هناك أنواع أخرى لن نتطرق اليها ) وأن ما سيأتى بعد ذلك امتدادات لهؤلاء أو تطوير لأحد البرامج السابقة .

ما سنركز عليه فى الآتى هو ثلاث برامج للShell هى:

tcsh وهو امتداد للcsh و bourne again shell والذى يختصر ب bash وهو امتداد ل sh وأخيرا Public Domain Korn Shell وهو امتداد ل Ksh .
ويجب ان تعلم أن الbash هو ال shell الأفتراضى لمعظم أنظمة اللينوكس .


The Bourne Again Shell (Bash)
BASH وهو أمتداد وتطوير ل SH وتمت اضافة بعض الأشياء الجديدة والأضافات التى حسنت من ال Bourne Shell كما أنه يحتوى على بعض مميزات الKsh و Csh .

كما أن ال bash يحتوى على واجهة برمجية قوية ومرنة كما أنه يمكنك من التفاعل مع النظام .

ولل BASH مميزات عدة منها أنه يوفر لك تسهيلات كبيرة عند كتابة الأوامر أو مسارات المجلدات التى تود الأنتقال اليها فى لحظة ما .
ولتوضيح ذلك افتح برنامج الTerminal الذى تستخدمه وكما قلنا سابقا أن التيرمينال هو البرنامج الذى تكتب فيه أوامر ال Shell ومن أمثال الTerminal برنامج Konsole وبرنامج Eterm و Kterm و Aterm والعديد من البرامج التى تختلف فيما بينها فى كيفية توفير واجهة مريحة للمسخدم .
نفذ التالى :
أكتب الأمر
*********************************************************************************
Rich (BB code):
[root@localhost ahmed]# cd /
 [root@localhost /]#
*********************************************************************************
وبالتالي تكون واقفا على نظام الملفات الرئيسى .
أكتب نفس الأمر السابق لكن متبوعا بزر الtab وانظر ماذا سيحدث
*********************************************************************************
Rich (BB code):
[root@localhost /]# cd  [tab]
bin       dev       home      lib       .mozilla  proc      sbin      tmp       var
boot      etc       initrd    mnt       opt       root      sys       usr
*********************************************************************************
بل جرب الأمر التالى
اكتب الأمر cd متبوعا ب حرف s ثم اضغط tab
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Rich (BB code):
[root@localhost /]# cd s [tab]
sbin  sys
[root@localhost /]#
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
نعم فقد قام bash بعرض كل المجلدات الموجودة فى هذا المجلد والتى تبدأ بحرف s .
-------------------------------------------------------------------------------------------------------------------------
ملحوظة: اذا كان المجلد الحالى كان لا يحتوى الا على مجلد واحد يبدأ حرف S كان الBash سيقوم بالدخول الى هذا المجلد تلقائيا .
فمثلا لو استبدلت حرف s السابق بحرف m ثم الضغط على tab سيدخل الى مجلد /mnt تلقائيا بعد ضغط Enter .
---------------------------------------------------------------------------------------------------------
أتمنى أن تكون قد لاحظت فائدة هذه الإمكانية فى ترحمك من حفظ الكثير من اﻷوامر كما سنرى :

أكتب ba فى التيرمينال ثم اضغط tab ستجده يظهر لك كل الأوامر والبرامج التى تبدأ بحرفى ba .
شىء رائع أليس كذلك وهذه الأمكانية فى الBash كفيلة بسد أفواه المتكلمين والجهلاء الذين يتهمون اللينوكس بالصعوبة بسبب كثرة الأوامر ربما يكون صحيحا أن الأوامر كثيرة لكن لو أنك تتذكر حرفا واحدا من الأمر انحلت المشكلة !!!!!
وليس هذا فحسب بل هناك ما يسمى ب Wild Card. لو كنت قد تعاملت مع جمل ال SQL وهى جمل الأستعلام وخصوصا مع جملة select فإذا أردت مثلا أن تختار السجلات التى يبدأ أسم العميل فيها بحرف a ماذا كنا نفعل ؟؟؟ بكل بساطة كنا نكتب التالى :
select * from [table name] where name like '*a'
نحن هنا لا نتحدث عن جمل الأستعلام ولكن نتحدث عن مرونة ال Bash فجملة الأستعلام السابقة تقوم بإرجاع القيم التى تبدأ بحرف الa فمثلا لو كان بالجدول ahmed , ali , alias ,amgad,arkan ,afrakosh ,.............
فستقوم الجملة السابقة بإرجاع جميع الأسماء السابقة نفس النظام هنا فى الباش يمكنك كتابة التالى
cd m *
فكتابة أو وضع * قبل أى حرف سيجعل الباش يقوم بالبحث عن كل المجلدات ( فى هذه الحالة مجلدات ربما تكون أوامر فى وضع آخر) التى تبدأ بحرف m وتنتهى بأى عدد من الحروف أو الكلمات ولو وجد مجلدا واحدا فقط هو الذى يبدأ بحرف m سيدخل إليه مباشرا أما ان كان هناك أكثر من مجلد ففى هذه الحالة سيقوم بترتيبهم أبجديا وسيدخل فى أول واحد منهم من الناحية الأبجدية .

لذلك فهذه الطريقة ليست عملية فى الحالة الأخيرة لذلك فإن ال Wildcard * يستخدم فى حالة التعامل مع الملفات المتشابهة فى الأمتداد على سبيل المثال :
لو أفترضنا أن لديك مجلدا بداخله هذه الملفات
first.doc second.doc third.doc ahmed guid
ثم أنك تريد أن تقوم بطبع الملفات التى تنتهى بالأمتداد .doc فهناك طريقتين أما أن تقوم بكتابة اسماء الملفات كلها أو تقوم بتنفيذ الآتى بكل سهولة

Rich (BB code):
 [root@localhost etc]# lpr   *.doc
فهذه الطريقة تغنى عن
Rich (BB code):
[root@localhost etc]# lpr   first.doc    second.doc    third.doc
كما يوجد العديد من Wild card Pattern من أمثال ( ? ) الذى يقوم بالأستعاضة عن حرف واحد فقط .
فكما قلنا سابقا يقوم * بالتعويض عن أى عدد من الحروف أو الكلمات لكن ؟ يقوم بالتعويض عن حرف واحد فقط .
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ومن مميزات ال bash ايضا الذاكرة أو ال History حيث أنه يقوم بحفظ الأوامر التى أدخلتها فى قائمة تخزن هذه القائمة داخل ملف يسمى فى الوضع الأفتراضى .bash_history حيث أنه عند دخولك للنظام يقوم الbash بملىء هذه الذاكرة من هذا الملف ويوجد هذا الملف فى مجلد home للمستخدم الحالى .
ملحوظة : هذا الملف من الملفات التى تبدأ ب (.) وتسمى النقطة هذه بال period وهذه الملفات يقوم النظام بإنشاءها وتكون مخبأة ( Hidden) ولكى تراها يجب عليك اظهار الملفات المخفية أو كتابة الأمر ls مع الخيار a- أى يكون الأمر هكذا
Rich (BB code):
[ahmed@localhost ahmed]$ ls -a
./                         .dmrc              .kaffeine/   .openoffice/
../                        .esd_auth          .kde/        .qt/
.adobe/                    .fonts/            .kderc       .recently-used
Andal/                     .fonts.cache-1     .licq/       rhl10_files/
.appletviewer              .fonts.conf        .lyx/        rhl10.htm
.assistant/                .gaim/             .Mail/       .screenrc
.audacity                  .gconf/            .mailcap     .sversionrc
.bash_history              .gconfd/           .mcop/       .thumbnails/
.bash_logout               .gftp/             .mcoprc      tmp/
.bash_profile              .gnome/            .MdkOnline/  .tmsnc/
.bash_profile~             .gnome2/           .metacity/   .totem.ahmed=
.bashrc                    .gnome2_private/   .mime.types  .Trash/
core.5341                  .gnupg/            .mozilla/    .Xauthority
.csmashrc                  .gstreamer-0.8/    .mplayer/    .xine/
.DCOPserver_localhost__0   .gtkrc-1.2-gnome2  .nautilus/   .xmms/
.DCOPserver_localhost_:0@  .i18n*             .net_applet  .xmovierc
.desktop*                  .ICEauthority      .netbeans/   .xsession-errors
Desktop/                   JavaApplication1/  .oofficerc*
[ahmed@localhost ahmed]$
ويمكنك استدعاء الأوامر المخزنة لديك فى الHistory باستخدام أزرار UP و Down .
حيث يقوم زر Up باستعراض أخر أمر كتبته ثم الذى يليه وهكذا .
كما يمكنك استخدام زر down لعمل العكس كما أنه يمكن التعديل فى الأمر الذى استدعيه من ال History باستخدام زرى Left و Right .

كما يمكنك عرض ال History باستخدام الأمر history الذى يقوم بعرض الhistory بهذه الطريقة

Rich (BB code):
[ahmed@localhost ahmed]$ history 
   87  mnt
   88  exit
   89  ksh
   90  exit
   91  log
   92  exit
   93  shell
   94  bash
   95  exit
   96  kwrite fstab
   97   su
   98  kdf
   99  su
  100  kde
  101  su
  102  acm
  103  bsh
تلاحظ أنه قد قام بعرض كل ما تم كتابته سابقا ولكن ماذا لو أردت مثلا عرض آخر 10 أوامر قد كتبتها
ماعليك الا أن تكتب الأمر السابق متبوعا برقم 10 هكذا
Rich (BB code):
[ahmed@localhost ahmed]$ history 10
  131  pwd
  132  dir
  133  clear
  134  free
  135  ls -a
  136  free
  137 ls
  138  history
  139  history 5
  140  history 10
[ahmed@localhost ahmed]$
ولو أردت آخر خمس أوامر يمكنك كتابة رقم ٥ بعد الأمر History .


الى اللقاء بحول الله

 
بارك الله فيك على الموضوع الرائع والجهد الأروع
وجزاك الله خيرا
تقبل تحياتــــي وتقديري
 
مقدمة عن بعض الأوامر المهمة
أولا يجب أن تعرف أن هناك شيئا يسمى الأمر Command وهناك شيئا آخر يسمى
Command Options أو خيارات الأمر.
وتستخدم Command Options لتحسين أداء الأمر أو إضافة مميزات جديدة الى الأمر الأصلى .

على سبيل المثال :

الأمر ls ( ls ليس أمر من أوامر الShell المبنية فيه كما وضحنا سابقا ولكن سأشير اليه فى هذا الدرس على أنه أمر ) يقوم بعرض جميع الملفات الموجودة على القرص الصلب أو الموجودة فى ملف ما .

Rich (BB code):
[ahmed@localhost ahmed]$ ls
Desktop/  JavaApplication1/  tmp/
[ahmed@localhost ahmed]$

لكن جرب اضافة الخيار a- مع الأمر ls وفى نفس المكان السابق دون تغيير :

Rich (BB code):
[ahmed@localhost ahmed]$ ls -a
./                         .dmrc              .kde/         .recently-used
../                        .fonts/            .kderc        .screenrc
.audacity                  .fonts.cache-1     .mailcap      .sversionrc
.bash_history              .fonts.conf        .mcop/        .thumbnails/
.bash_logout               .gconf/            .MdkOnline/   tmp/
.bash_profile              .gconfd/           .mime.types   .Xauthority
.bash_profile~             .gnome/            .mozilla/     .xine/
.bashrc                    .gnome2/           .mplayer/     .xmms/
.DCOPserver_localhost__0   .gnome2_private/   .netbeans/    .xsession-errors
.DCOPserver_localhost_:0@  .ICEauthority      .oofficerc*
.desktop*                  JavaApplication1/  .openoffice/
Desktop/                   .kaffeine/         .qt/
[ahmed@localhost ahmed]$
بالتأكيد ربما تكون قد لاحظت الفرق بين الأمر الأول بدون الخيار والأمر مع الخيار .
عندما استخدمنا ls بالخيار a- ( لاحظ وجود مسافة بين ls و a- ولاحظ أيضا أنه لاتوجد مسافات بين (-)
و (a) ) قام بعرض التالى :
Rich (BB code):
[ahmed@localhost ahmed]$ ls -a
./                         .dmrc              .kde/         .recently-used
../                        .fonts/            .kderc        .screenrc
.audacity                  .fonts.cache-1     .mailcap      .sversionrc
.bash_history              .fonts.conf        .mcop/        .thumbnails/
.bash_logout               .gconf/            .MdkOnline/   tmp/
.bash_profile              .gconfd/           .mime.types   .Xauthority
.bash_profile~             .gnome/            .mozilla/     .xine/
.bashrc                    .gnome2/           .mplayer/     .xmms/
.DCOPserver_localhost__0   .gnome2_private/   .netbeans/    .xsession-errors
.DCOPserver_localhost_:0@  .ICEauthority      .oofficerc*
.desktop*                  JavaApplication1/  .openoffice/
Desktop/                   .kaffeine/         .qt/
[ahmed@localhost ahmed]$
فقد قام الخيار a- بجعل ls يقوم بعرض جميع الملفات حتى التى تحتوى على (.) بأولها وتسمى هذه
النقطة بالPeriod والملفات التى تبدأ بالPeriod فى معظمها تكون ملفات من صنع اللينوكس (ملفات يكونها النظام الحاكم عفوا يكونها نظام التشغيل ) ومن هنا يمكننا القول بأن الخيارات التى تضاف الى الأمر تعطى الأمر بعض الأمكانيات الجديدة .

والأمر ls لديه الكثير من الخيارات (Options) الأخرى مثل (U-) وأرجو أن تجربه أنت الآن .

ويجدر بنا الأشارة هنا أيضا الى أن ال (-) وتسمى dash ليست جزءا من ال Command Option ولكنها تقوم باخبار الشيل أيا كان نوعه بأن كل حرف سيأتى بعدها على أنه خيار للأمر .

ويمكنك وضع أو تشغيل أكثر من خيار مرة واحدة :
على سبيل المثال استخدمنا قبل ذلك الخيار a مع الأمر ls واستخدمت أنت الخيار U مع نفس الأمر
ماذا أذا أردنا تنفيذ الأثنين معا ؟؟
بكل بساطة أكتب الأمر متبوعا بمسافة ثم ال dash ثم الخيارات التى تريدها متتالية .

Rich (BB code):
  [ahmed@localhost ahmed]$ ls -aU

ماذا حدث ؟؟؟

نرجع الى البداية عندما طلبت منك استخدام الخيار U- مع ls قام بعرض كل الملفات الموجودة لكن دون ترتيب فالأمر ls ( بمفرده) يقوم بعرض الملفات مرتبة ترتيبا هجائيا .

لذلك اذا نفذت الأمر ls مع الخيار U و a سيقوم بعرض الملفات دون استثناء حتى التى تحتوى على الPeriod ويقوم بعرضها غير مرتبة .

Rich (BB code):
[ahmed@localhost ahmed]$ ls -aU
./                .gnome/                    Desktop/        .audacity
../               .Xauthority                .fonts/         .mozilla/
tmp/              .gnome2/                   .thumbnails/    .netbeans/
.screenrc         .gnome2_private/           .ICEauthority   JavaApplication1/
.bash_logout      .gconf/                    .bash_history   .mime.types
.bash_profile     .gconfd/                   .fonts.conf     .mailcap
.bashrc           .qt/                       .kderc          .openoffice/
.dmrc             .DCOPserver_localhost__0   .bash_profile~  .sversionrc
.desktop*         .mcop/                     .xine/          .oofficerc*
.xsession-errors  .fonts.cache-1             .xmms/          .adobe/
.MdkOnline/       .DCOPserver_localhost_:0@  .recently-used
.kde/             .mplayer/                  .kaffeine/
[ahmed@localhost ahmed]$
ربما تكون قد لاحظت الفرق ولاحظ هنا أن ترتيب الخيارات لا يهم سواء كتبت aU- أو كتبت Ua- فلهما نفس النتيجة .
ويمكنك أيضا استخدام طريقة Multiple Option وذلك بفصل كل خيار عن الآخر باستخدام dash (-) عن الخيار السابق .
مثلا لتنفيذ آخر أمر بهذه الطريقة يكون على الشكل التالى :
Rich (BB code):
[ahmed@localhost ahmed]$ ls   -a   -U

ويجب أن نشير الى بعض الخيارات المهمة أيضا مع الأمر ls وهى:
-1 الخيار (t) :-
ففى بعض الأحيان تريد أن تعرف متى تم عمل ملف ما ومتى تم التعديل فيه . ويمكنك الخيار (t) من
عرض الملفات وترتيبها بالتاريخ بدلا من ترتيبها هجائيا فيقوم بعرض الملفات الجديدة أولا .

Rich (BB code):
[root@localhost / ]# ls -t
root/  tmp/  boot/  initrd/  sys/   home/  lib/   var/
dev/   usr/  etc/   opt/     proc/  bin/   sbin/  mnt/
[root@localhost /]#

-2 الخيار ( r ) :-
يقوم بعرض الملفات بطريقة عسكية ويتم استخدامه مع الخيار t حتى يقوم بعرض الملفات وترتيبها من الأقدم الى الأحدث لاحظ :
Rich (BB code):
[root@localhost /]# ls -tr
mnt/  sbin/  bin/   proc/  opt/     etc/   usr/  dev/
var/  lib/   home/  sys/   initrd/  boot/  tmp/  root/
[root@localhost /]#
 
بسم الله الرحمن الرحيم

تناولنا سابقا أمر ls وذكرنا معظم الخيارات التى تأتى معه والآن بإذن الله تعالى سنقدم بعض الأوامر الأخرى التى ربما لا يمكنك الإستغناء عنها فى تعاملك مع Shell .

أولا يجب أن أذكر لك معلومة يجب أن تعرفها جيدا وهى أن الShell يوفر لك أمران Two Commands فى غاية الاهمية وهما man و info .

man تعنى manual وهى تمكنك من عرض جميع المعلومات عن أمر معين أقول جميع المعلومات يعنى كأنه كتيب تشغيل لأحد الأجهزة التى اشتريتها مؤخرا !!!!!!!!!!!
ويستخدم هكذا :
Rich (BB code):
[ahmed@localhost ahmed]$ man ls
فقط أكتب man وبعده اسم الأمر الذى تريد معلومات عنه ( هنا استخدمنا ls كمثال ) وكان ناتج الأمر السابق :
Rich (BB code):
LS(1)                            User Commands                           LS(1)

NAME
       ls - list directory contents

SYNOPSIS
       ls [OPTION]... [FILE]...

DESCRIPTION
       List  information  about  the FILEs (the current directory by default).
       Sort entries alphabetically if none of -cftuSUX nor --sort.

       Mandatory arguments to long options are  mandatory  for  short  options
       too.

       -a, --all
              do not hide entries starting with .

       -A, --almost-all
              do not list implied . and ..

       --author
              print the author of each file

       -b, --escape
              print octal escapes for nongraphic characters

وتلاحظ أن الصفحة ممتلئة اضغط على زر Down و Up للنزول والصعود بين الأسطر أو استخدم Page Down و Page Up للنزول بالصفحات وللخروج اضغط على زر Q .

أمر info له نفس الوظيفة لكن مع اختلاف التنسيق الذى يعرض به البيانات .
جرب الأتى info ls ونفس التحكم بالصفحة كما هو الحال مع man .

الفرق بين man و info هو أن man يقال أنه من أيام UNIX أما info مستحدث لكن لا توجد مشكلة فكلاهما برامج حرة ( man,info برامج وليسوا أوامر ) .

نعود الى موضوع الأوامر المهمة والآن نحن بصدد التحدث عن الأمر cd :

ربما تتذكر نظام التشغيل DOS وتتذكر هذا الأمر أيضا وهو يعنى Change Directory . ربما من الأسم تكون قد فهمت عمل هذا الامر فهو يقوم بتغير المجلد الحالى الذى تقف عليه .
فمثلا لو أنك تقف على المجلد ahmed هكذا :

Rich (BB code):
[ahmed@localhost ahmed]$
وأردت الدخول الى المجلد ali الموجود داخل المجلد ahmed ماذا تفعل اذن ؟؟؟؟؟
بكل سهولة أكتب الامر cd متبوعا بأسم المجلد الذى تريد الدخول اليه هكذا

Rich (BB code):
[ahmed@localhost ahmed]$ cd ali
[ahmed@localhost ali]$
( لاحظ أن المجلد على يجب أن يكون موجودا )
وللعودة مرة اخرى الى المجلد الذى يحتوى المجلد الذى أنت بداخله أكتب الأمر cd متبوعا بنقطتين هكذا
Rich (BB code):
[ahmed@localhost ali]$ cd ..
[ahmed@localhost ahmed]$
ماذا إذا أردت الذهاب إلى بيتك؟؟
أكتب الأمر cd متبوعا ب ~ وستجد نفسك فى بيتك !!!!
Rich (BB code):
[ahmed@localhost usr]$ cd ~
[ahmed@localhost ahmed]$
للذهاب الى ملفات النظام اكتب الأمر
Rich (BB code):
[ahmed@localhost ahmed]$ cd /
[ahmed@localhost /]$

أمر mkdir

لو كنت تريد انشاء مجلد directory جديد استخدم الأمر الأمر mkdir (وهو أختصارا لكلمة make directory ) متبوعا بأسم المجلد الذى تريد انشاؤه هكذا:

Rich (BB code):
[ahmed@localhost ahmed]$ mkdir arabteam
[ahmed@localhost ahmed]$ cd arabteam 
[ahmed@localhost arabteam]$

أمر rmdir

وهو اختصارا لكلمة remove directory ويستخدم لحذف مجلد ويستخدم هكذا:

Rich (BB code):
[ahmed@localhost arabteam]$ rmdir dir_name

كل الكلام السابق بالنسبة للمجلدات ماذا عن الملفات ؟؟

الأمر touch يعطيك امكانية انشاء (ملف) فارغ جديد بالإمتداد الذى تريده هكذا:

Rich (BB code):
[ahmed@localhost arabteam]$ touch Barq
[ahmed@localhost arabteam]$ touch Kaboos
[ahmed@localhost arabteam]$

نعم فلقد قمنا بانشاء ملفين اسمهما Barq و Kaboos .
ولو قمت بكتابة اﻷمر ls لرأيت الملفين .

مثال آخر :
لكتابة برنامج C /C++ أو جافا Java أو حتى ملف نصى Text يجب ان يكون للملف امتداد معين فلو كان ملف C كان الإمتداد c. ولو كان جافا كان الأمتداد java. لو كان text يبقى الأمتداد txt. نختار ملف واحد من السابق مثلا تريد انشاء ملف جافا بكل سهولة اكتب الأمر التالى :

Rich (BB code):
[ahmed@localhost arabteam]$ touch Main.java

ربما تسألنى سؤالا :
ما الفائدة التى استفدتها من عمل ملف بأسم معين ولكن ليس بداخله أى شىء ؟؟؟
 
والأجابة هى انك تسرعت قليلا !
فكما تمكنا من عمل الملف سنتمكن بإذن الله من ملىء الملف والكتابة والتعديل وعرض ما فيه بإذن الله .

نبدأ أولا بعرض محتويات الملف ونستخدم لهذا الغرض الأمر cat متبوعا بأسم الملف هكذا :

Rich (BB code):
[ahmed@localhost arabteam]$ cat -n  Main.java
     1
     2  //created by Engineer Shaheen
     3  import javax.swing.*;
     4
     5  /**
     6   *
     7   * @author ahmed
     8   */
     9  public class Main {
    10
    11      /**
    12       * @param args the command line arguments
    13       */
    14      public static void main(String[] args) {
    15        JOptionPane.showMessageDialog(null,"Hello world ! \n Shaheen Soft");
    16        System.exit(0);
    17      }
    18
    19  }
[ahmed@localhost arabteam]$

لاحظ أننى قد ملئت الملف قبل ذلك بهذه البيانات .
استخدمت الخيار n لكى يرقم كل سطر من أسطر الملف .
وللتعديل والإضافة فى الملف استخدم أحد برامج تحرير النصوص text editors
مثل kwrite ,Emacs ,gedit,kate,nedit,................
أو أى برنامج لديك .
ويمكنك استخدام ذلك من خلال سطر اﻷوامر كالأتى :
مثلا أنا استخدم دائما برنامج kwrite ويمكنك أنت استخدام ما شئت . لتعديل الملف السابق عن طريق أحد برامج تحرير النصوص مثل kwrite :

Rich (BB code):
[ahmed@localhost arabteam]$ kwrite Main.java
[ahmed@localhost arabteam]$

سيظهر لك برنامج kwrite ذو الواجهة الرسومية الجميلة ويمكنك تعديل ما شئت من النص وحفظه أو حفظه فى مكان آخر أو أى شىء يروق لك .
وسأقوم فى الدروس القادمة بإذن الله بتقديم نبذة مختصرة عن أهم محررات النصوص المشهورة فى لينوكس .
استخدمنا قبل ذلك الأمر rmdir لحذف مجلد وماذا إذن لو أردت حذف ملف ؟؟؟

استخدم الأمر rm ويعنى remove ويستخدم هكذا :
Rich (BB code):
[ahmed@localhost arabteam]$ touch windows
[ahmed@localhost arabteam]$ rm windows
rm: remove regular empty file `windows'? y
[ahmed@localhost arabteam]$

لقد قمت بعمل ملف واسميته windows ثم قمت بمحوه بالأمر rm

لاحظ أيضا أن هذا الأمر يمكن أن يستخدم مع المجلدات ولكنه يقوم بمحو المجلد أو الملف نهائيا دون الرمى فى سلة المهملات التى تسمى Trash ويستخدم مه المجلدات باستخدام الخيار r لحذف كل الملفات والمجلدات التى توجد بداخل المجلد والخيار f للحذف بدون سؤال التأكيد هكذا :

Rich (BB code):
[ahmed@localhost ahmed]$ rm -rf ali
[ahmed@localhost ahmed]$
الأمر cp :

نستخدم الأمر cp لنسح ملف من مكان الى آخر وربما فى نفس المكان هكذا :

Rich (BB code):
[ahmed@localhost arabteam]$ cp Main.java Main.cpp
[ahmed@localhost arabteam]$

سيقوم الأمر بنسخ الملف بكل محتوياته وتسمية ملف جديد يحتوى على هذه المحتويات لكن اسمه Main.cpp .
ماذا لو أردت سخ الملف الى مكان آخر غير المجلد الموجود به ؟؟؟
>>>> أكتب المسار كاملا هكذا :

Rich (BB code):
[ahmed@localhost arabteam]$ cp Main.java /mnt
cp: cannot create regular file `/mnt/Main.java': Permission denied
[ahmed@localhost arabteam]$

ما هذا ؟؟؟

يقول ال Shell أن Permission denied !!!!!
يعنى لم يتم نسخ الملف هل تعرف لماذا ؟؟؟
الإجابة ببساطة تتلخص فى الآتى :
هل سمعت يوما من يقول أن اللينوكس نظام آمن ؟؟
هل سمعت يوما من يقول أن لكل مستخدم من مستخدمى النظام له صلاحية معينة ؟؟
هل سمعت يوما من يقول أن اللينوكس يدعم تعدد المستخدمين ؟؟
هل سمعت يوما أن هناك مستخدم يسمى ال Super User أو Administrator أو الRoot ؟

اذا كانت اجاباتك على بعض هذه الأسئلة بنعم فيمكنك الإستمرار معنا ! وإن لم تكن كذلك فيجب عليك أولا مراجعة حساباتك !!!

يجب علينا الآن أن أوضح لك نبذة مختصرة عن ما هو ال Root أو ماهو المستخدم الرئيسى للجهاز .
ال Root هو المستخدم الوحيد الذى يملك صلاحية التعديل فى كل شىء يخص النظام والمستخدمين لهذا النظام .
دائما كنت أسمع هذا المثل ((( المركب اللى عليها رئيسين تغرق ))) يعنى اذا ترك الأمر لكل مستخدم من مستخدمى الجهاز يعبث بالنظام فبعد يوم واحد من اﻷستخدام سوف لايكون هناك ما يسمى بالنظام .

لذلك وضع لكل مستخدم صلاحيات معينة كهذه الحالة التى نحن بصددها فالShell لم يستطيع نسخ الملف التى تريده الى مجلد mnt/ وذلك بكل بساطة لأنك ليست لديك الصلاحية بأن تكتب على مجلد من مجلدات النظام وهو mnt/ لذلك أعطاك رسالة خطأ .
حسنا ما الحل اذا كنت مضطرا لعمل ذلك ؟؟
نعم يمكنك عمل ذلك ببساطة لكن مع وجود شرط واحد ألا وهو ال password للمستخدم Root وإن لم تكن لديك فلا يمكنك ذلك !
فلنفرض أنك لديك ال password للمستخدم Root ولو أردنا تنفيذ الأمر السابق قم بالآتى :

Rich (BB code):
[ahmed@localhost arabteam]$ su
Password:
[root@localhost arabteam]#

استخدم أمر su لكى تدخل الى صلاحيات المستخدم الجذر Root وقم بعدها بإدخال ال Password وتلاحظ بعدها تغير علامة الPrompt من $ الى # كما أن المستخدم أصبح Root@localhost وليس ahmed@localhost .

وبذلك تكون لك الصلاحية بعمل أى شىء فى النظام.
نفذ أمر النسخ السابق هكذا :
Rich (BB code):
[root@localhost arabteam]# cp Main.java /mnt
[root@localhost arabteam]#

لو قمت بالذهاب الى المجلد mnt/ ستجد هناك ملف اسمه Main.java .

( لاحظ أن أمر su يعنى Super User )
ولا حظ أيضا أنه عند تثبيت بعض الحزم أو البرامج لا تتمكن من ذلك ويعطيك رسالة بعدم السماح لك بهذا والمشكلة تكون فى هذه الحالة أنك مستخدم عادى والحل هو بالدخول ك Su من الامر su وادخال ال Password كما شرحنا سابقا .
ننتقل الى نقطة أخرى خاصة بأمر آخر اسمه ln .
أتتذكر أخونا Windows كان فيه حاجة عنده أسمها shortcut أو اختصار وهى عبارة عن وصلة تحتوى على مسار ملف ما . الآن فى اللينوكس أصبح أسمها link ونستخدم الأمر ln لعمل ذلك.
جرب هذا الأمر

Rich (BB code):
[root@localhost arabteam]# ln Main.cpp /mnt/a.cpp
فى الدرس القادم بإذن الله سنتحدث عن أمر ln
ولكن قبل ذلك أستخدم man الخاص بالأمر ln قبل أن أشرحه فى المرة القادمة التى سنتابع فيها باقى الحديث عن أشهر اﻷوامر المستخدمة فى نظام التشغيل لينوكس .


سبحان الله وبحمده سبحان الله العظيم

 
Arab Penguin .. أنت رائع بحق ..

شرح وافي كافي و لا أحلى منه ..

بس انتظر أخلص تنزيل و تحميل السوزي .. و راح أجيلك و نشوف الموضوع ماشي كيف ..

تحياتي لك أيها المبدع
 


قبل أن أخوض فى درس اليوم أريد فقط أن نرجع الى الأمر CD لكى نفصل بين أمرين مهمين جدا فلو سألتك سؤالا بسيطا يا أخى الكريم ما الفرق بين الأمرين التاليين:
cd ahmed
cd /home/ahmed
أرجو يا أخى أن تعيرنى الأهتمام قليلا :-
الأول يقوم بتغيير المجلد أو Directory الحالى الى المجلد ahmed الموجود فى نفس المجلد الحالى
للتوضيح أكثر :
لو أنك مثلا فى المجلد var ( ويمكن أن تعرف المسار الحالى أو المجلد الحالى كما قلنا سابقا من خلال الأمر pwd ) وأردت تنفيذ الأمر الأول يجب أن يكون لديك مجلد يسمى ahmed داخل هذا المجلد (var ) وهو يسمى فى هذه الحالة بالمجلد الأب .
أما الأمر الثانى فهو يقوم بتغيير المسار الحالى أو المجلد الحالى الى المجلد home/ahmed/ أى الى المجلد ahmed الموجود داخل المجلد home ويمكنك تنفيذ هذا الأمر وأنت فى أى مجلد .
فى المرة السابقة توقفنا عند أمر ln وقلنا أنه يقوم بعمل Shortcut او link لملف أو مجلد من المجلدات وطلبت منك أن تراجع هذا الأمر بنفسك وهذا الأمر لا أريدك أن تعرف عنه الكثير من الخيارات ربما الخيار الوحيد الذى ستستخدمه هو s- وهو يقوم بعمل symbolic links بدلا من hard link .
Rich (BB code):
[ahmed@localhost ahmed]$ ln -s /etc/fstab  /home/ahmed
[ahmed@localhost ahmed]$
ولو قمت بعمل listing للمجلد ahmed لرأيت اللينك موجود :
Rich (BB code):
[ahmed@localhost ahmed]$ ls
Desktop/  fstab@  tmp/
[ahmed@localhost ahmed]$
نستكمل الحديث عن الاوامر الأساسية والمهمة فى نظام التشغيل لينوكس :
الأمر find :
يستخدم الأمر find للبحث عن الملفات والمجلدات الموجودة لديك أو بعبارة أخرى يقوم بعمل Search على أى ملف تريده وفى أى مكان تريد أن يبحث فيه ويستخدم هكذا :
Rich (BB code):
[ahmed@localhost ahmed]$ find   [المكان المراد البحث فيه]  -name [اسم الملف المراد البحث عنه]
مثال :
لو أننا نريد أن نبحث عن الملف javac فى المجلد usr/java/ سنقوم بالأتى :
Rich (BB code):
[ahmed@localhost ahmed]$ find   /usr/java   -name   javac
/usr/java/jdk1.5.0_04/bin/javac
[ahmed@localhost ahmed]$
تلاحظ أنه قام بالبحث ثم طبع المسار لهذا الملف كاملا كما تلاحظ .
مثال آخر :
نريد أن نبحث عن الملف bash1 فى المجلد usr/ :
Rich (BB code):
[ahmed@localhost ahmed]$ find /usr/bin -name bash1
/usr/bin/bash1
[ahmed@localhost ahmed]$
تلاحظ أنه قام بإيجاد المسار لهذا الملف وقام بطبعه كاملا .
ويجب هنا أن نذكر بعض الخيارات الأخرى التى تجعل عملية البحث أكثر مرونة وقوة مثل البحث عن الملفات عن طريق التاريخ !!!!!
مثال :
فى المثال السابق قمنا بالبحث عن طريق الأسم فقط لكن هنا سنقوم بالبحث عن طريق النوع أو الخصائص مثل البحث عن الأوامر أو البرامج التى لم يتم استخدامها فى خلال ال ٧ أيام الماضية أستخدم الأمر find مع الخيار type- كما يلى :
[ahmed@localhost ahmed]$ find /usr/bin -type f -atime +7
والنتيجة كما لاحظت تكون كبيرة ( ربما لديك تكون صغيرة ) ولذلك سأعرض منها جزءا قليلا
Rich (BB code):
........................
........................
/usr/bin/xdvizilla
/usr/bin/mytool
/usr/bin/uniconv
/usr/bin/uniprint
/usr/bin/yudit
/usr/bin/progen
/usr/bin/tmake
/usr/bin/cu
/usr/bin/uucp
/usr/bin/uulog
/usr/bin/uuname
/usr/bin/uupick
/usr/bin/uustat
/usr/bin/uuto
/usr/bin/uux
/usr/bin/ukxim
/usr/bin/unikey
/usr/bin/acpi
/usr/bin/acroread
/usr/bin/genkdmconf
/usr/bin/kdm_config
/usr/bin/kdm_greet
/usr/bin/krootimage
[ahmed@localhost ahmed]$
لاحظ أننا وضعنا عدد الأيام بعد الخيار atime- .
كما أن أمر find يدعم ال wild card مثل (*,? ) :
مثلا يا سيدي لو أنك تريد أن تبحث عن كل الملفات التى تنتهى بالإمتداد so.
Rich (BB code):
[ahmed@localhost ahmed]$ find /usr/lib   -name  *.so
ويجب أن تعلم أن الأمر find لديه الكثير من الخيارات لا يمكننى أن أناقشها الآن لأننى سأتطرق الى أوامر أخرى بعد ذلك أكثر فاعلية من الأمر find ليس فى كل المهام ولكن فى مهام معينة تتعلق بالأوامر والبرامج وقبل أن أنتقل الى هذه النقطة أذكر لكم خيارا جديدا للأمر find أسمه xdev- وهو يقوم بتحديد مجال البحث للأمر find فى مجلد معين من مجلدات النظام .
أرجو أن تأخذ قسطا من الراحة أو تطبيق ما قمنا بشرحه من أوامر حتى الآن حتى تثبت المعلومة .
استمر>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 


الأمر Whereis

يستطيع هذا الأمر البحث بسرعة عن الملفات وخصوصا الأوامر ويقوم بعرض معلومات عنها كما سنرى:

بالتأكيد تتذكر الأمر find الذى شرحناه للتو . الآن أنا أريد أن أعرف أين يقع هذا الأمر فى جهازى وأين يوجد الmanual الخاص به :
Rich (BB code):
[ahmed@localhost ahmed]$ whereis find
find: /bin/find /usr/bin/find /usr/share/man/man1/find.1.bz2
[ahmed@localhost ahmed]$

نجد أن الأمر قام بعرض مسار الأمر find كاملا وهو المجلد usr/bin/ و أيضا فى bin/ وأن ال manual pages له موجودة فى /usr/share/man/man1/ .

ولعرض النسخة الbinary فقط من الامر whereis استخدم الخيار b- هكذا :
Rich (BB code):
[ahmed@localhost ahmed]$ whereis -b find
find: /bin/find /usr/bin/find
[ahmed@localhost ahmed]$

نستنتج من ذلك أن الأمر whereis يقوم بتحديد مكان الأوامر وال man وهذا الأمر أسرع من أمر find لأنه يبحث فى أماكن معينة مثل usr/bin/ أو usr/sbin/ أو bin/ لذلك فهو أسرع فى عملية البحث .
الأمر locate :

اذا لم يكفيك find و whereis فى عمليات البحث التى تجريها فلا تقلق يا عزيزى فأخونا لينوكس أو بالأحرى أخونا Shell يفكر فيما تفكر فيه ويحاول أن يوفر لك كل ما تحتاجه وما لا تحتاجه أيضا .
أمر locate يقوم باستخدام قاعدة بيانات لأسماء الملفات وأماكنها وبذلك نكون قد وفرنا الوقت فى عمليه البحث فبدلا من أن يتم البحث فى جميع الملفات الموجودة فى الجهاز أو التى حددتها يقوم الأمر بالبحث فى قاعدة البيانات التى بناها والتى تحتوى على أسماء كل الملفات على جهازك .

وقبل أن تقوم باستخدام هذا الأمر لأول مرة يجب أولا أن تقوم بعمل قاعدة البيانات !!!
ايه ؟؟؟
مش أنت ياعم لسة بتقول أن ال shell ده مرن وسهل ؟ قاعدة بيانات ايه الى عايزنى أعملها ؟
أقول لك لا تقلق يا عزيزى والله العظيم أخونا shell مظلوم بس أصبر شوية .
شوف يا سيدي كل ما عليك هو أن أنت تدخل لحساب ال Super User أو Root وذلك بالأمر su كما قلنا سابقا وبعد ذلك تدخل ال password وبعدها أكتب الأمر updatedb وأنتظر لحظات لكى يقوم بعمل قاعدة البيانات وبعدها يكون الملف الذى يحتوى على أسماء ومسارات الملفات موجود لديك ويمكنك بعدها استخدام الأمر locate بسهولة .
مثال نريد أن نبحث عن الملفات التى يكون امتدادها so :
Rich (BB code):
[ahmed@localhost ahmed]$ locate *.so

طبعا رأيت النتيجة بنفسك ورأيت ايضا سرعة البحث وقارنه باستخدام أمر find .
ويجب أن أشير هنا الى موضوع أو ملحوظة أجلتها قليلا وجاء وقتها وهى أنك تستطيع تعرف معلومات مختصرة عن أى أمر عن طريق الخيار help-- حيث يعطيك نبذة عن الأمر وعن الخيارات الموجودة مع هذا الأمر وكذلك وظيفة كل خيار :
مثلا لو أردت اظهار بعض المعلومات المختصرة عن الأمر ls :
Rich (BB code):
 [ahmed@localhost ahmed]$ ls -- help

سيعطيك هذه النتيجة
Rich (BB code):
Usage: ls [OPTION]... [FILE]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuSUX nor --sort.

Mandatory arguments to long options are mandatory for short options too.
  -a, --all                  do not hide entries starting with .
  -A, --almost-all           do not list implied . and ..
      --author               print the author of each file
  -b, --escape               print octal escapes for nongraphic characters
      --block-size=SIZE      use SIZE-byte blocks
  -B, --ignore-backups       do not list implied entries ending with ~
  -c                         with -lt: sort by, and show, ctime (time of last
                               modification of file status information)
                               with -l: show ctime and sort by name
                               otherwise: sort by ctime
  -C                         list entries by columns
      --color[=WHEN]         control whether color is used to distinguish file
                               types.  WHEN may be `never', `always', or `auto'
  -d, --directory            list directory entries instead of contents,
                               and do not dereference symbolic links
  -D, --dired                generate output designed for Emacs' dired mode
  -f                         do not sort, enable -aU, disable -lst
  -F, --classify             append indicator (one of */=@|) to entries
      --format=WORD          across -x, commas -m, horizontal -x, long -l,
                               single-column -1, verbose -l, vertical -C
      --full-time            like -l --time-style=full-iso
  -g                         like -l, but do not list owner
  -G, --no-group             inhibit display of group information
  -h, --human-readable  print sizes in human readable format (e.g., 1K 234M 2G)
      --si                   likewise, but use powers of 1000 not 1024
  -H, --dereference-command-line
                             follow symbolic links listed on the command line
      --dereference-command-line-symlink-to-dir
                             follow each command line symbolic link
                               that points to a directory
      --indicator-style=WORD append indicator with style WORD to entry names:
                               none (default), classify (-F), file-type (-p)
  -i, --inode                print index number of each file
  -I, --ignore=PATTERN       do not list implied entries matching shell PATTERN
  -k                         like --block-size=1K
  -l                         use a long listing format
  -L, --dereference          when showing file information for a symbolic
                               link, show information for the file the link
                               references rather than for the link itself
  -m                         fill width with a comma separated list of entries
  -n, --numeric-uid-gid      like -l, but list numeric UIDs and GIDs
  -N, --literal              print raw entry names (don't treat e.g. control
                               characters specially)
  -o                         like -l, but do not list group information
  -p, --file-type            append indicator (one of /=@|) to entries
  -q, --hide-control-chars   print ? instead of non graphic characters
      --show-control-chars   show non graphic characters as-is (default
                             unless program is `ls' and output is a terminal)
  -Q, --quote-name           enclose entry names in double quotes
      --quoting-style=WORD   use quoting style WORD for entry names:
                               literal, locale, shell, shell-always, c, escape
  -r, --reverse              reverse order while sorting
  -R, --recursive            list subdirectories recursively
  -s, --size                 print size of each file, in blocks
  -S                         sort by file size
      --sort=WORD            extension -X, none -U, size -S, time -t,
                               version -v
                             status -c, time -t, atime -u, access -u, use -u
      --time=WORD            show time as WORD instead of modification time:
                               atime, access, use, ctime or status; use
                               specified time as sort key if --sort=time
      --time-style=STYLE     show times using style STYLE:
                               full-iso, long-iso, iso, locale, +FORMAT
                             FORMAT is interpreted like `date'; if FORMAT is
                             FORMAT1<newline>FORMAT2, FORMAT1 applies to
                             non-recent files and FORMAT2 to recent files;
                             if STYLE is prefixed with `posix-', STYLE
                             takes effect only outside the POSIX locale
  -t                         sort by modification time
  -T, --tabsize=COLS         assume tab stops at each COLS instead of 8
  -u                         with -lt: sort by, and show, access time
                               with -l: show access time and sort by name
                               otherwise: sort by access time
  -U                         do not sort; list entries in directory order
  -v                         sort by version
  -w, --width=COLS           assume screen width instead of current value
  -x                         list entries by lines instead of by columns
  -X                         sort alphabetically by entry extension
  -1                         list one file per line
      --help     display this help and exit
      --version  output version information and exit

SIZE may be (or may be an integer optionally followed by) one of following:
kB 1000, K 1024, MB 1000*1000, M 1024*1024, and so on for G, T, P, E, Z, Y.

By default, color is not used to distinguish types of files.  That is
equivalent to using --color=none.  Using the --color option without the
optional WHEN argument is equivalent to using --color=always.  With
--color=auto, color codes are output only if standard output is connected
to a terminal (tty).

Report bugs to <bug-coreutils@gnu.org>.
[ahmed@localhost ahmed]$

معلومات جيدة تعتبر فى كثير من الأحيان أفضل من استخدام الman .

وهناك أيضا أمر يسمى whatis يقوم بعرض معلومات مختصرة عن الأوامر وهو كالأمر السابق locate يحتاج الى قاعدة بيانات خاصة به ويجب تكوين هذه القاعدة قبل استخدام هذا الأمر لأول مرة بالدخول الى حساب المستخدم root وكتابة الأمر makewhatis وانتظر بعض الوقت لكى يكون القاعدة .
وبعدها استخدم الامر whatis بسهولة .
مثال :
نريد أن نعرف معلومات أو وظيفة أمر ما أكتب الأمر whatis متبوعا بأسم الأمر الذى تريده هكذا :
Rich (BB code):
[ahmed@localhost ahmed]$ whatis ls
ls                   (1)  - list directory contents
[ahmed@localhost ahmed]$

/////////////////////////////////////////////////////////

[ahmed@localhost ahmed]$ whatis find
find                 (1)  - search for files in a directory hierarchy
[ahmed@localhost ahmed]$

ربما لم يخطر ببالك هذا السؤال :
أنا لا أريد أن أعرف وظيفة الأمر ؟؟ أنا لدى الوظيفة فعلا ولكنى لا أعرف ما هو الأمر !!!!!!!
أو ربما يكون السؤال بصيغة أخرى :
أنا لا أعرف الأمر الذى أريد أن أستخدمه لعمل وظيفة معينة ؟؟؟

أيا كان صيغة السؤال فالإجابة موجودة :-
لدينا أمر جميل جدا اسمه apropos وهو يستخدم الdatabase التى يستخدمها الأمر whatis لكن بطريقة مختلفة .
مثال :
لو لديك الوظيفة أو المهمة وهى مثلا تريد أن تبحث Search فى الجهاز عن ملف معين ولا تعرف كيف تقوم بوظيفة البحث هذه ولا تعرف ما هو الأمر أو الأوامر التى تستخدمها ماذا تفعل اذن؟؟؟

الإجابة : سينصحك أحد أصدقاءك العباقرة ويقول لك سيبك من النظام ( المعفن ) ده ياعم هو فيه أحسن من الويندوز اللى الواحد بيبقى قاعد زى الباشا وهو بيعمل كل حاجة !

ربما يكون جزء من نصيحة صديقك العبقرى صحيحا لكن صديقك هذا لا يعرف الكثير من المعلومات الدقيقة .
ايه يا سيدى اللى أنت عايز تعمله ؟؟
ج: أنا عايز أعمل search .
خلاص يا عم أكتب الأمر apropos متبوعا بكلمة Search وشوف النتيجة .
Rich (BB code):
[ahmed@localhost ahmed]$ apropos search
هل رأيت النتيجة !

Rich (BB code):
apropos              (1)  - search the whatis database for strings
badblocks            (8)  - search a device for bad blocks
bsearch              (3)  - binary search of a sorted array
find                 (1)  - search for files in a directory hierarchy
gnome-search-tool    (1)  - the GNOME Search Tool
hcreate [hsearch]    (3)  - hash table management
hdestroy [hsearch]   (3)  - hash table management
hsearch              (3)  - hash table management
lfind [lsearch]      (3)  - linear search of an array
lkbib                (1)  - search bibliographic databases
lookbib              (1)  - search bibliographic databases
look [Search::Dict]  (3pm)  - search for key in dictionary file
lsearch              (3)  - linear search of an array
lsearch              (n)  - See if a list contains a particular element
manpath [man]        (1)  - determine user's search path for man pages
Net::LDAP::Reference (3pm)  - search reference
Net::LDAP::Search    (3pm)  - Object returned by Net::LDAP search method
res_search [resolver] (3)  - resolver routines
Search::Dict         (3pm)  - search for key in dictionary file
strcspn [strspn]     (3)  - search a string for a set of characters
strpbrk              (3)  - search a string for any of a set of characters
strspn               (3)  - search a string for a set of characters
tdelete [tsearch]    (3)  - manage a binary tree
tfind [tsearch]      (3)  - manage a binary tree
tsearch              (3)  - manage a binary tree
twalk [tsearch]      (3)  - manage a binary tree
wcschr               (3)  - search a wide character in a wide-character string
wcscspn              (3)  - search a wide-character string for any of a set of wide characters
wcspbrk              (3)  - search a wide-character string for any of a set of wide characters
wcsrchr              (3)  - search a wide character in a wide-character string
whatis               (1)  - search the whatis database for complete words
wmemchr              (3)  - search a wide character in a wide-character array
zgrep                (1)  - search possibly compressed files for a regular expression
zipgrep              (1)  - search files in a ZIP archive for lines matching a pattern
bsearch              (3)  - binary search of a sorted array
hcreate [hsearch]    (3)  - hash table management
hdestroy [hsearch]   (3)  - hash table management
hsearch              (3)  - hash table management
lfind [lsearch]      (3)  - linear search of an array
lsearch              (3)  - linear search of an array
res_search [resolver] (3)  - resolver routines
strcspn [strspn]     (3)  - search a string for a set of characters
strpbrk              (3)  - search a string for any of a set of characters
strspn               (3)  - search a string for a set of characters
tdelete [tsearch]    (3)  - manage a binary tree
tfind [tsearch]      (3)  - manage a binary tree
tsearch              (3)  - manage a binary tree
twalk [tsearch]      (3)  - manage a binary tree
wcschr               (3)  - search a wide character in a wide-character string
wcscspn              (3)  - search a wide-character string for any of a set of wide characters
wcspbrk              (3)  - search a wide-character string for any of a set of wide characters
wcsrchr              (3)  - search a wide character in a wide-character string
wmemchr              (3)  - search a wide character in a wide-character array
[ahmed@localhost ahmed]$

ومن الملاحظ أنه قد أظهر أول أمر من الأوامر التى تقوم بالبحث وهو الأمر apropos !!
ارجو أن تكون قد أدركت هذا الواقع .

ويجدر بنا الأشارة هنا أنه يمكنك استخدام أمر man السابق لكى يقوم بنفس مهمة الأمر apropos ولكن الأمر man نستخدمه هنا مع الخيار k- ولكن سيكون البحث بطىء قليلا ....
جرب هذا
Rich (BB code):
[ahmed@localhost ahmed]$ man -k search
والنتيجة

Rich (BB code):
apropos              (1)  - search the whatis database for strings
badblocks            (8)  - search a device for bad blocks
bsearch              (3)  - binary search of a sorted array
find                 (1)  - search for files in a directory hierarchy
gnome-search-tool    (1)  - the GNOME Search Tool
hcreate [hsearch]    (3)  - hash table management
hdestroy [hsearch]   (3)  - hash table management
hsearch              (3)  - hash table management
lfind [lsearch]      (3)  - linear search of an array
lkbib                (1)  - search bibliographic databases
lookbib              (1)  - search bibliographic databases
look [Search::Dict]  (3pm)  - search for key in dictionary file
lsearch              (3)  - linear search of an array
lsearch              (n)  - See if a list contains a particular element
manpath [man]        (1)  - determine user's search path for man pages
Net::LDAP::Reference (3pm)  - search reference
Net::LDAP::Search    (3pm)  - Object returned by Net::LDAP search method
res_search [resolver] (3)  - resolver routines
Search::Dict         (3pm)  - search for key in dictionary file
strcspn [strspn]     (3)  - search a string for a set of characters
strpbrk              (3)  - search a string for any of a set of characters
strspn               (3)  - search a string for a set of characters
tdelete [tsearch]    (3)  - manage a binary tree
tfind [tsearch]      (3)  - manage a binary tree
tsearch              (3)  - manage a binary tree
twalk [tsearch]      (3)  - manage a binary tree
wcschr               (3)  - search a wide character in a wide-character string
wcscspn              (3)  - search a wide-character string for any of a set of wide characters
wcspbrk              (3)  - search a wide-character string for any of a set of wide characters
wcsrchr              (3)  - search a wide character in a wide-character string
whatis               (1)  - search the whatis database for complete words
wmemchr              (3)  - search a wide character in a wide-character array
zgrep                (1)  - search possibly compressed files for a regular expression
zipgrep              (1)  - search files in a ZIP archive for lines matching a pattern
bsearch              (3)  - binary search of a sorted array
hcreate [hsearch]    (3)  - hash table management
hdestroy [hsearch]   (3)  - hash table management
hsearch              (3)  - hash table management
lfind [lsearch]      (3)  - linear search of an array
lsearch              (3)  - linear search of an array
res_search [resolver] (3)  - resolver routines
strcspn [strspn]     (3)  - search a string for a set of characters
strpbrk              (3)  - search a string for any of a set of characters
strspn               (3)  - search a string for a set of characters
tdelete [tsearch]    (3)  - manage a binary tree
tfind [tsearch]      (3)  - manage a binary tree
tsearch              (3)  - manage a binary tree
twalk [tsearch]      (3)  - manage a binary tree
wcschr               (3)  - search a wide character in a wide-character string
wcscspn              (3)  - search a wide-character string for any of a set of wide characters
wcspbrk              (3)  - search a wide-character string for any of a set of wide characters
wcsrchr              (3)  - search a wide character in a wide-character string
wmemchr              (3)  - search a wide character in a wide-character array
[ahmed@localhost ahmed]$
وبذلك نكون تقريبا قد غطّينا أو وضعنا أساسيات البحث عن الملفات وعن الأوامر وبذلك نستطيع أن ننتقل الى مواضيع أخرى مثل ضغط وفك ضغط الملفات وغيرها من المواضيع المهمة .
أرجو أن تكون قد استفدت يا أخى الكريم من هذا الدرس وأرجو الله تعالى أن يعيننى ويساعدنى فى أنجاز باقى الدروس وكذلك مساعدتى على اخراجها بشكل ملائم ودقيق .

Rich (BB code):
والى اللقاء بإذن الله تعالى .
 


ضغط وفك ضغط الملفات

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

أولا يجب أن نتطرق الى ما هى الأرشيفات وكيف أقوم بعملها ؟
كلمة أرشيف تعنى مجموعة من الملفات والمجلدات موجودة مع بعضها البعض فى مكان واحد . ويتم التعامل معها على أنها ملف واحد !

كيفية عمل الأرشيف Archive :
لعمل أرشيف من الملفات أو المجلدات أو الأثنين معا بإستخدام الأمر tar وهو يعنى Tape ARchive .

وهذا البرنامج له جذور عميقة فى الحاسب الآلى قبل ظهور ال Hard disks أو Floppy drives أو CD-ROM's فكانت البرامج أو Software عموما يوزع ويخزن على الشرائط المغناطيسية وكان من أول البرامج التى تم استخدامها على الحاسب لقراءة المعلومات المخزنة على هذه الشرائط هو قارىء الأشرطة أو Tape reader وتم تطوير البرنامج بمرور الوقت وتم استخدام البرنامج فى عمل الPackaging أو التعبئة للبرامج المستخدمة على اللينوكس ( لاحظ أن معظم التوزيعات مثل Redhat و Fedora و Mandrake تستخدم برنامج rpm وهناك توزيعات أخرى لديها نظام تعبئة Packaging خاص بها مثل deb الموجود فى ال Debian ) .

يمكنك عمل أرشيف من النوع tar عن طريق الأمر tar :
مثال
سنقوم الآن بعمل مجلد سنسميه مثلا arabteam وقم بعمل 3 ملفات بداخله وسمها file1 ,file2 ,file3 هكذا :
Rich (BB code):
[ahmed@localhost ahmed]$ mkdir arabteam
[ahmed@localhost ahmed]$ cd arabteam
[ahmed@localhost arabteam]$ touch file1 file2 file3
[ahmed@localhost arabteam]$

قم بعمل مجلد داخل المجلد arabteam وسميه Sub_arabteam ويجب أن تلاحظ أن هذا المجلد يعتبر مجلد فرعى من المجلد الرئيسى .
وقم أيضا بعمل ثلاث ملفات جديدة file21 ,file22 ,file23 داخل المجلد الفرعى sub_arabteam .

Rich (BB code):
[ahmed@localhost arabteam]$ mkdir sub_arabteam
[ahmed@localhost arabteam]$ cd sub_arabteam
[ahmed@localhost sub_arabteam]$ touch file21 file22 file23
[ahmed@localhost sub_arabteam]$

أكتب الأمر tree متبوعا arabteam لكى ترى الشجرة التكوينة للمجلد arabteam :

Rich (BB code):
[ahmed@localhost sub_arabteam]$ cd ../..
[ahmed@localhost ahmed]$ tree arabteam
arabteam
|-- file1
|-- file2
|-- file3
`-- sub_arabteam
    |-- file21
    |-- file22
    `-- file23

1 directory, 6 files
[ahmed@localhost ahmed]$
تلاحظ أن المجلد arabteam يحتوى على ٦ ملفات و مجلد فرعى واحد .

نرجع الى موضوعنا فنحن نريد عمل أرشيف وليكن عمل أرشيف من المجلد arabteam .
حسنا قم بكتابة الأمر tar متبوعا بالخيار c- ( وهو يعنى create) وكذلك الخيار f- ( وهو يعنى file) ثم أسم الأرشيف وليكن arabteam.tar وفى النهاية اسم المجلد المراد عمل الأرشيف منه هكذا :

Rich (BB code):
[ahmed@localhost ahmed]$ tar -cf arabteam.tar arabteam
[ahmed@localhost ahmed]$

وهكذا قد تم عمل الأرشيف ولو أردت أن ترى ما يحدث أثناء عمل الأرشيف استخدم الخيار v- هكذا :
Rich (BB code):
[ahmed@localhost ahmed]$ tar -cvf arabteam.tar arabteam
arabteam/
arabteam/file1
arabteam/file2
arabteam/file3
arabteam/sub_arabteam/
arabteam/sub_arabteam/file21
arabteam/sub_arabteam/file22
arabteam/sub_arabteam/file23
[ahmed@localhost ahmed]$

فهو يقوم بإطلاعك على ما يقوم بإضافته من مجلدات و ملفات أثناء عمل الأرشيف .
ولو كنت تريد أضافة عدد معين فقط من الملفات ولا تريد إضافة ملفات أخرى موجودة داخل أحد المجلدات الفرعية أو تحت المجلد الرئيسى :

استخدم الخيار cwf ولا حظ أن الترتيب مهم يعنى cwf لا تساوى fwc :
Rich (BB code):
[ahmed@localhost ahmed]$ tar -cwf arabteam.tar arabteam
add `arabteam'?y
add `arabteam/file1'?n
add `arabteam/file2'?n
add `arabteam/file3'?y
add `arabteam/sub_arabteam'?y
add `arabteam/sub_arabteam/file21'?y
add `arabteam/sub_arabteam/file22'?n
add `arabteam/sub_arabteam/file23'?y
[ahmed@localhost ahmed]$
ماذا لو أردت عرض أحد الأرشفة يعنى لو أردت عرض ما يحتويه أرشيف ما :
أستخدم الخيار tf- هكذا :
ولاحظ أيضا الترتيب فى الخيارات مهم .
Rich (BB code):
[ahmed@localhost ahmed]$ tar -tf  arabteam.tar
arabteam/
arabteam/file3
arabteam/sub_arabteam/
arabteam/sub_arabteam/file21
arabteam/sub_arabteam/file23
[ahmed@localhost ahmed]$
بذلم نكون أنتهينا من طريقة عمل وعرض محتويات الأرشيف ننتقل الآن الى الخطوة العكسية وهى كيفية استخراج محتويات الأرشيف.

أولا لكى تستخرج محتويات أرشيف ما استخدم الخيار -x مع الخيار v- وكذلك الخيار f- لكى يصبح الخيار كله xvf- ( ملحوظة : دائما اجعل الخيار f هو الأخير اذا اتى معه خيار آخر ) :
Rich (BB code):
[ahmed@localhost ahmed]$ tar -xvf arabteam.tar
arabteam/
arabteam/file3
arabteam/sub_arabteam/
arabteam/sub_arabteam/file21
arabteam/sub_arabteam/file23
[ahmed@localhost ahmed]$

ولو أردت استخراج ملف واحد أو عدد قليل من الملفات الموجودة فى الأرشيف استخدم الخيار w مع الخيارات السابقة :
Rich (BB code):
[ahmed@localhost ahmed]$ tar -xvwf arabteam.tar
extract `arabteam'?y
arabteam/
extract `arabteam/file3'?y
arabteam/file3
extract `arabteam/sub_arabteam'?y
arabteam/sub_arabteam/
extract `arabteam/sub_arabteam/file21'?n
extract `arabteam/sub_arabteam/file23'?y
arabteam/sub_arabteam/file23
[ahmed@localhost ahmed]$

ولو كان هذا مملا وكنت تعرف الملف الذى تريد استخراجه فقط فلا تقلق اتبع التالى :
مثلا لو أنك تريد استخراج الملف file23 الموجود داخل المجلد الفرعى sub_arabteam فقم بكتابة الأمر tar متبوعا بالخيار xf- متبوعا باسم الأرشيف متبوعا بمسار الملف الذى تريد استخراجه :
Rich (BB code):
[ahmed@localhost ahmed]$ tar -xf arabteam.tar arabteam/sub_arabteam/file23
[ahmed@localhost ahmed]$
Cpio Archive
أمر cpio يستطيع نسخ الملفات من أو الى أرشيف تم عمله باستخدام برنامج tar أو ارشيف جديد من النوع cpio .
لكن هناك ميزة فى cpio وهى أنه متوافق مع ال tar يعنى يقوم بنفس وظائف الtar بالإضافة الى وظائف أخرى خاصة به ولكن نادر جدا لو رأيت برنامج أو ملفات أرشيفية معموله بهذا البرنامج Cpio لذلك اذا أردت المزيد عنه اقرأ الhelp أو ال man pages الخاصة به .

ضغط الملفات باستخدام gzip
أمر gzip لضغط الملفات هذا الأمر ليس لتوفير المساحة فقط ولكن بضمه مع ال tar يصبحان أكثر هيئات تعبئة وضغط برامج اللينوكس .
بالتأكيد أو ربما دخلت يوما ما الى ألأنترنت لكى تبحث عن برنامج ما وبالتأكيــــــــــــــــــــد وجدته وقمت بتنزيله على جهازك وفى النهايه وجدت أن الملف ينتهى بالإمتداد tar.gz. أو tgz. أو ربما وأنت تبحث فى جهازك وجدت الكثير من الوثائق Documentations الموجودة على جهازك مضغوطة بهذه الضيغة ( لاحظ أن gzip يقوم بضغط الملفات من النوع text بنسبة تتراوح بين 60-70 % ) .

ويجب أن نشير الى نقطة مهمة قبل أن نبدأ باستخدام gzip وهى أنه يمكنك أن تضغط ملفات عادية أو تقوم بضغط الأرشيفات من النوع tar .

أولا لكى نضغط أرشيف من النوع tar :
أكتب الأمر gzip متبوعا بإسم الأرشيف :
Rich (BB code):
[ahmed@localhost ahmed]$ gzip arabteam.tar
[ahmed@localhost ahmed]$

ولو قمت بعمل list للمجلد ahmed ستجد بداخله الملف المضغوط الجديد

Rich (BB code):
[ahmed@localhost ahmed]$ ls
arabteam/        CppEssentials.pdf  fstab@       tmp/
arabteam.tar.gz  Desktop/           messege.txt
[ahmed@localhost ahmed]$

لكن أين الأرشيف arabteam.tar ؟؟؟
الأجابة هى أن الأمر gzip يقوم بحذف الملف الأصلى بعد ضغطه .

تلاحظ من النتيجة السابقة أن الأمر gzip قام بضغط الأرشيف السابق لكنه وضع له الإمتداد gz. فأصبح أسم الملف الجديد arabteam.tar.gz لكن ليس gz. هو الإمتداد الوحيد فقط لكن هناك gzip. ولكن ال Default أو الإمتداد الإعتيادى هو gz.
أما بالنسبة لضغط الملفات غير الأرشيفات أستخدم الأمر gzip متبوعا بإسم الملف :
Rich (BB code):
gzip  filename
ويمكنك أيضا تحديد مستوى ضغط الملف كالآتى :
Rich (BB code):
[ahmed@localhost ahmed]$ gzip -9 arabteam.tar
[ahmed@localhost ahmed]$

حيث ٩ هو مستوى الضغط وسأحاول تغطيه هذه النقطة لاحقا .

هناك خيارا آخرا لكى تغير به الإمتداد للملف المضغوط فكما قلنا سابقا أن الملف المضغوط يخرج بالإمتداد gz. فلو أردنا أن يخرج بالإمتداد gzip. مثلا فماذا نفعل ؟
فقط استخدم الخيار S- وهو يعنى ال suffix متبوعا بالإمتداد المطلوب هكذا :
Rich (BB code):
[ahmed@localhost ahmed]$ gzip -S .gzip arabteam.tar
[ahmed@localhost ahmed]$ ls
arabteam/          CppEssentials.pdf  fstab@       tmp/
arabteam.tar.gzip  Desktop/           messege.txt
[ahmed@localhost ahmed]$

وهناك خيار آخر يجب علي أن أذكره وهو الخيار l- وهو يعنى list ويستخدم لعرض حجم الملفات المضغوطة وغير المضغوطة :

Rich (BB code):
[ahmed@localhost ahmed]$ gzip -l arabteam.tar.gzip
compressed  uncompr. ratio uncompressed_name
      214     10240  98.2% arabteam.tar.gzip
[ahmed@localhost ahmed]$

وهناك أيضا الخيار tv- وهو يتأكد من أن الملف المضغوط فى حالة سليمة أم لا فإن لم يجد أى خطأ فإنه يعطيك ok
Rich (BB code):
[ahmed@localhost ahmed]$ gzip -tv arabteam.tar.gzip
arabteam.tar.gzip:       OK
[ahmed@localhost ahmed]$
فى الدرس القادم بإذن الله تعالى سنتكلم عن كيفية فك ضغط الملفات المضغوطة وعن سبل آخرى لضغط الملفات .
Rich (BB code):
سبحان الله وبحمده سبحان الله العظيم
 


جزاك الله عنا خيرا أخوي..
شكـــ1000ـــر ..
و بانتظار المزيد..
 
عودة
أعلى