File Command

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

أمر file يحدد نوع الملف الحقيقي بناءً على محتواه (وليس فقط الامتداد).

يعني:

  • قد يكون الملف اسمه something.txt لكنه في الحقيقة برنامج أو ملف مضغوط
  • file يساعدك تفهم: هل هو نص؟ صورة؟ تنفيذ؟ أرشيف؟ …

متى يفيدك؟

  • تستلم ملف “غريب” وما تعرف تفتحه
  • امتداد الملف غير صحيح
  • تريد تعرف نوع ملف قبل تشغيله/فك ضغطه
2) الصيغة العامة (Syntax)
file [OPTIONS] FILE...
Bash

يمكن تمرر أكثر من ملف مرة واحدة:

file README.md Dockerfile archive.zip
Bash
3) أمثلة بسيطة (Exploring file)
أ) فحص ملفات معروفة
cd ~/project
file README.md
file Dockerfile
Bash
ب) إنشاء ملف نصي وفحصه
echo "This is a text file" > example.txt
file example.txt
Bash

عادةً يعطي شيء مثل:

example.txt: ASCII text
Bash
4) أهم فكرة: file لا يعتمد على الامتداد

جرّب خداع الامتداد:

echo "hello" > real_text
cp real_text fake.jpg
file fake.jpg
Bash

ستلاحظ أنه سيقول إنه ملف نصي وليس صورة، لأن المحتوى نصي.


5) إنشاء أنواع ملفات مختلفة للتجربة (Identifying File Types)
أ) ملف نصي + ملف ثنائي (binary) + ملف مضغوط
cd ~/project
echo "This is a text file" > text_file.txt

# ملف ثنائي عشوائي
dd if=/dev/urandom of=binary_file.bin bs=1M count=1 >/dev/null 2>&1

# ضغط الملف النصي
gzip -c text_file.txt > text_file.txt.gz
Bash

الآن افحص الأنواع:

file text_file.txt
file binary_file.bin
file text_file.txt.gz
Bash
6) خيارات مهمة في file
أ) -b عرض “النوع فقط” بدون اسم الملف

مفيد للسكربتات:

file -b text_file.txt
Bash
ب) -i عرض نوع MIME (مفيد للويب/البرامج)
file -i text_file.txt
file -i text_file.txt.gz
Bash

قد يعطي مثلًا:

text/plain; charset=us-ascii
application/gzip; charset=binary
Bash
ج) -z فحص “داخل” الملفات المضغوطة

لو عندك ملف .gz وتريد تعرف الملف الأصلي داخله:

file -z text_file.txt.gz
Bash

مهم: -z يفيد خصوصًا مع بعض أنواع الضغط لفهم “ما بداخلها”.

7) التعامل مع الملفات المضغوطة (Handling Compressed Files)
أ) أرشيف tar.gz

أنشئ أرشيف:

cd ~/project
tar -czf archive.tar.gz text_file.txt binary_file.bin
Bash

افحص نوعه:

file archive.tar.gz
Bash

فك الضغط/الاستخراج:

tar -xzf archive.tar.gz
ls -l
Bash
ب) gzip / gunzip

ضغط:

gzip text_file.txt
file text_file.txt.gz
Bash

فك الضغط:

gunzip text_file.txt.gz
file text_file.txt
Bash
ج) ZIP

إذا عندك zip:

file example.zip
Bash

ولفكّه (إذا أداة unzip موجودة):

unzip example.zip
Bash
8) استخدامات عملية قوية
أ) قبل تشغيل ملف — تأكد نوعه
file some_downloaded_file
Bash

إذا قال:

  • “ELF 64-bit” → غالبًا برنامج لينكس
  • “POSIX shell script” → سكربت شيل
  • “PDF document” → ملف PDF
  • “Zip archive data” → zip
ب) اكتشاف “ملف تنفيذي” vs “نصي”
file /bin/ls
file /etc/hosts
Bash
9) أخطاء شائعة للمبتدئ
أ) الاعتماد على الامتداد فقط

الامتداد قد يكون مضلل. دائمًا إذا الملف مجهول:

file filename
Bash
ب) file يقول “data”

هذا يعني: لا يستطيع تحديد النوع بدقة (غالبًا ملف ثنائي عشوائي أو غير معروف).

10) تدريب سريع (Practice)

نفّذ هذا:

cd ~/project
mkdir -p file_practice
cd file_practice

echo "hello" > a.txt
dd if=/dev/urandom of=b.bin bs=256 count=1 >/dev/null 2>&1
gzip -c a.txt > a.txt.gz

file a.txt b.bin a.txt.gz
file -i a.txt a.txt.gz
file -b a.txt
file -z a.txt.gz
Bash
هل الشرح الأصلي كافي؟

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

  • فكرة أن file يعتمد على المحتوى وليس الامتداد (مع مثال “fake.jpg”)
  • خيارات مفيدة جدًا عمليًا: -i (MIME) و -b (للإخراج المختصر)
  • ربط file مع أدوات فك الضغط (tar, gzip, unzip)