Stat Command

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

أمر stat يعرض معلومات تفصيلية جدًا عن ملف أو مجلد، مثل:

  • الحجم (Size) والمساحة على القرص (Blocks)
  • نوع الملف (ملف/مجلد/رابط…)
  • الصلاحيات (Permissions)
  • المالك والمجموعة (Owner/Group)
  • أوقات الملف (Timestamps): Access / Modify / Change / Birth (إن وجدت)
  • رقم الـ inode وعدد الروابط (Links)

متى يفيدك؟

  • عندما تريد تعرف “لماذا هذا الملف لا ينفتح؟” (صلاحيات)
  • عندما تريد تراقب أوقات التعديل (مفيد مع touch)
  • عندما تريد تعرف هل ملفين هم نفس الـ inode (hard links)
  • في السكربتات لاستخراج قيمة معينة بدقة (size، owner…)
2) الصيغة العامة (Syntax)
stat [OPTIONS] FILE_OR_DIRECTORY
Bash

مثال:

stat ~/project/example.txt
Bash
3) مثال عملي سريع (إنشاء ملف ثم قراءة بياناته)
cd ~/project
touch example.txt
stat example.txt
Bash
4) شرح مخرجات stat (كيف تقرأها كمبتدئ)

شكل المخرجات يختلف قليلًا حسب النظام، لكن غالبًا يكون قريب من:

File: example.txt
Size: 0          Blocks: 0          IO Block: 4096   regular empty file
Device: 801h/2049d  Inode: 131075    Links: 1
Access: (0644/-rw-r--r--)  Uid: (1000/user)  Gid: (1000/user)
Access: 2023-04-11 ...
Modify: 2023-04-11 ...
Change: 2023-04-11 ...
 Birth: -
Bash
أهم سطور لازم تفهمها:
أ) File

يعرض اسم/مسار الملف.

ب) Size / Blocks / IO Block
  • Size: حجم الملف بالبايت (logical size)
  • Blocks: عدد البلوكات المستخدمة فعليًا على القرص (قد يختلف عن Size)
  • IO Block: حجم البلوك في نظام الملفات (مثل 4096 غالبًا)
ج) Inode / Links
  • Inode: رقم تعريف الملف داخل نظام الملفات
  • Links: عدد الروابط الصلبة (hard links) لنفس inode
    إذا كان 2 أو أكثر → غالبًا هناك hard link
د) Access (permissions) + Uid/Gid
  • 0644 رقم الصلاحيات
  • -rw-r--r-- شكل الصلاحيات النصي
  • Uid/Gid مالك الملف والمجموعة (إما أرقام أو أسماء)
هـ) الأوقات (Timestamps)
  • Access: آخر مرة تم “الوصول/القراءة” للملف (atime)
  • Modify: آخر مرة تغير محتوى الملف (mtime)
  • Change: آخر مرة تغيرت بيانات الميتاداتا (مثل chmod/chown) (ctime)
  • Birth: وقت إنشاء الملف (ليس متوفر دائمًا)

ملاحظة مهمة:
Change ليس “وقت تغيير المحتوى”، بل تغيير “الخصائص/الميتاداتا”.

5) استخراج معلومات محددة فقط (أهم ميزة): -c أو --format

بدل مخرجات طويلة، تقدر تطلب حقول معينة.

أ) حجم الملف فقط (bytes)
stat -c '%s' example.txt
Bash
ب) وقت آخر تعديل (mtime)
stat -c '%y' example.txt
Bash
ج) اسم الملف + الحجم + الصلاحيات
stat -c '%n  size=%s  perms=%A' example.txt
Bash
د) المالك والمجموعة
stat -c 'owner=%U group=%G' example.txt
Bash
هـ) رقم inode وعدد الروابط
stat -c 'inode=%i links=%h' example.txt
Bash

هذه الأوامر ممتازة للسكربتات والتقارير.

6) stat مع الروابط الرمزية (Symlink): الفرق بين العادي و -L

إذا عندك symlink:

cd ~/project
echo "hello" > target.txt
ln -s target.txt link.txt
Bash
أ) stat على الرابط نفسه (يعرض معلومات الرابط)
stat link.txt
Bash
ب) stat -L يتبع الرابط ويعرض معلومات الهدف
stat -L link.txt
Bash

استخدم -L عندما تريد بيانات الملف الحقيقي الذي يشير له الرابط.

7) stat مع المجلدات
mkdir -p ~/project/mydir
stat ~/project/mydir
Bash

سترى أن نوعه directory، وأوقات وصلاحيات خاصة بالمجلد.

8) تحليل الصلاحيات والملكية بسرعة (كما في الدرس)
أ) الصلاحيات + اسم المالك + المجموعة
stat -c '%A %U %G' example.txt
Bash

مثال ناتج:

-rw-r--r-- labex labex
Bash
ب) الصلاحيات + UID + GID (أرقام)
stat -c '%A %u %g' example.txt
Bash
9) استخدامات عملية مهمة جدًا
أ) التأكد هل ملفين هم نفس الملف (Hard Link)؟
cd ~/project
echo "X" > a.txt
ln a.txt b.txt
stat -c '%n inode=%i' a.txt b.txt
Bash

إذا الـ inode نفس الرقم → هذا hard link لنفس الملف.

ب) مراقبة وقت التعديل قبل/بعد touch
cd ~/project
touch time.txt
stat -c 'mtime=%y' time.txt
touch -m time.txt
stat -c 'mtime=%y' time.txt
Bash
10) تدريب سريع (Practice)

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

cd ~/project
mkdir -p stat_practice
cd stat_practice

echo "hello" > file.txt
ln file.txt hard.txt
ln -s file.txt soft.txt

# 1) معلومات كاملة
stat file.txt

# 2) حقول محددة
stat -c '%n %s %A %U:%G mtime=%y' file.txt

# 3) تحقق من inode للـ hard link
stat -c '%n inode=%i links=%h' file.txt hard.txt

# 4) stat على symlink (الرابط نفسه)
stat soft.txt

# 5) stat على الهدف عبر -L
stat -L soft.txt
Bash
هل الشرح الأصلي كافي؟

نعم جيد جدًا، لكن الإضافات المهمة للمبتدئ كانت:

  • شرح الفرق بين Modify و Change (خطأ شائع)
  • أمثلة واضحة على -c لاستخراج حقول مفيدة
  • توضيح -L مع symlink
  • استخدام stat لإثبات hard links عبر inode