IN Command

هذا شرح أمر ln بشكل شامل وموسع للمبتدئين وبنفس الأسلوب، مع أمثلة كثيرة داخل بلوكات كود + توضيح الفرق بين Hard Link و Symbolic Link + حالات عملية وأخطاء شائعة.

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

أمر ln يستخدم لإنشاء روابط (Links) لملف أو مجلد.

تخيل الرابط مثل “اختصار” أو “اسم إضافي” لنفس الشيء، لكن هناك نوعان:

  1. Hard Link (رابط صلب)
  2. Symbolic Link / Soft Link (رابط رمزي/لينك)
2) الصيغة العامة (Syntax)
إنشاء Hard Link
ln TARGET LINK_NAME
Bash
إنشاء Symbolic Link
ln -s TARGET LINK_NAME
Bash
3) الفرق بين Hard Link و Symbolic Link (بأبسط طريقة)
✅ Hard Link
  • هو اسم إضافي لنفس الملف نفسه (نفس البيانات على القرص).
  • يشترك مع الملف الأصلي في inode (رقم تعريف الملف).
  • إذا حذفت “اسمًا” منها، يبقى الملف موجود طالما يوجد اسم آخر (Hard link آخر).
  • لا يعمل عادةً مع المجلدات (لأسباب حماية وتفادي حلقات).
  • لا يمكنه عبور أنظمة ملفات مختلفة (مثل قسم مختلف / partition مختلف).
✅ Symbolic Link (Symlink)
  • هو ملف صغير يحتوي مسار الهدف (يشبه اختصار في ويندوز).
  • يمكنه أن يشير إلى ملف أو مجلد.
  • يمكنه عبور أنظمة ملفات مختلفة.
  • إذا تم نقل/حذف الهدف → يصبح الرابط مكسور (broken).
4) فهم سريع لـ inode ولماذا يهم؟

الـ inode هو “بطاقة هوية” للملف داخل نظام الملفات، يحتوي معلومات مثل:

  • مكان البيانات على القرص
  • الصلاحيات
  • المالك
  • الخ…

لفهم hard links عمليًا نستخدم:

ls -li
Bash

-i يظهر رقم الـ inode.

5) إنشاء Hard Link (مع مثال عملي)
خطوة 1: إنشاء ملف وكتابة محتوى
cd ~/project
echo "Hello from original" > file1.txt
Bash
خطوة 2: إنشاء hard link
ln file1.txt file1_hardlink.txt
Bash
خطوة 3: تحقق بالـ inode وعدد الروابط
ls -li file1.txt file1_hardlink.txt
ls -l  file1.txt file1_hardlink.txt
Bash

ماذا تتوقع؟

  • نفس رقم الـ inode للملفين
  • في ls -l العمود الثاني (عدد الروابط) غالبًا يصبح 2
خطوة 4: جرّب تعدّل المحتوى
echo "Updated content" > file1.txt
cat file1.txt
cat file1_hardlink.txt
Bash

سترى نفس المحتوى في الاثنين لأنهما “نفس الملف” فعليًا باسمين مختلفين.

خطوة 5: جرّب حذف الأصل
rm file1.txt
ls -l file1_hardlink.txt
cat file1_hardlink.txt
Bash

المفاجأة: الملف ما زال موجودًا عبر الـ hard link.

لأن البيانات لا تُحذف إلا عندما يصبح عدد الروابط = 0.

6) إنشاء Symbolic Link (Symlink) مع مثال عملي
خطوة 1: إنشاء ملف
cd ~/project
echo "Hello from file2" > file2.txt
Bash
خطوة 2: إنشاء symlink
ln -s file2.txt file2_symlink.txt
Bash
خطوة 3: تحقق
ls -l file2.txt file2_symlink.txt
Bash

ستلاحظ:

  • السطر الخاص بالرابط يبدأ بحرف l
  • ويظهر سهم مثل:
    file2_symlink.txt -> file2.txt
خطوة 4: جرّب حذف الهدف
rm file2.txt
cat file2_symlink.txt
Bash

هنا سيظهر خطأ لأن الرابط أصبح مكسور.

افحصه:

ls -l file2_symlink.txt
Bash
7) Symlink للمجلدات (ميزة مهمة)

بعكس hard link، الـ symlink يشتغل مع المجلدات:

cd ~/project
mkdir -p dir1
ln -s dir1 dir1_link
ls -l dir1 dir1_link
Bash

يمكنك الدخول للرابط كأنه مجلد:

cd dir1_link
pwd
Bash
8) مسارات نسبية vs مطلقة في symlink (نقطة مهمة)
أ) رابط بمسار نسبي (عادةً أفضل داخل نفس المشروع)
ln -s file2.txt link_to_file2
Bash
ب) رابط بمسار مطلق (أحيانًا أقوى لكنه أقل قابلية للنقل)
ln -s /home/labex/project/file2.txt abs_link
Bash

إذا نقلت المشروع لمكان آخر، الرابط المطلق غالبًا ينكسر، بينما النسبي قد يبقى صحيحًا.

9) استبدال رابط موجود أو ملف موجود (خيارات مهمة)
أ) -f إجبار الاستبدال
ln -sf target.txt linkname
Bash
ب) -i يسأل قبل الاستبدال
ln -si target.txt linkname
Bash
ج) إنشاء رابط داخل مجلد باسم تلقائي (مفيد)
ln -s file2.txt ~/project/somedir/
Bash
10) متى أستخدم Hard Link ومتى Symlink؟
استخدم Hard Link عندما:
  • تريد اسمين لنفس الملف داخل نفس نظام الملفات
  • تريد أن يبقى الملف موجودًا حتى لو حذف الاسم الأصلي
  • لا تحتاج الإشارة لمجلد
استخدم Symlink عندما:
  • تريد “اختصار” لملف أو مجلد
  • تريد رابطًا بين أماكن مختلفة
  • تريد ربط ملفات إعدادات (مثل dotfiles)
  • تريد مرونة أعلى
11) أخطاء شائعة وحلولها
أ) خطأ: “hard link not allowed for directory”

لأن hard links للمجلدات ممنوعة غالبًا.
✅ الحل: استخدم symlink:

ln -s dir1 dir1_link
Bash
ب) رابط symlink مكسور

إذا نقلت الهدف أو حذفته.
✅ تحقق:

ls -l linkname
Bash

ثم صحح الرابط:

ln -sf new_target linkname
Bash

ج) “File exists”

يعني الرابط/الملف موجود.
✅ استخدم:

ln -sf target linkname
Bash
12) تدريب عملي سريع (Practice)

نفّذ هذا داخل ~/project:

cd ~/project

# 1) Hard link
echo "A" > A.txt
ln A.txt A_hard.txt
ls -li A.txt A_hard.txt
rm A.txt
cat A_hard.txt

# 2) Symlink
echo "B" > B.txt
ln -s B.txt B_link.txt
ls -l B.txt B_link.txt
rm B.txt
ls -l B_link.txt
Bash
ملاحظة على النص الأصلي الذي أرسلته (تصحيح بسيط)

وصفه للـ hard link أنه “نسخة” صحيح من جهة النتائج، لكن الأدق:

  • ليس نسخة مستقلة، بل اسم إضافي لنفس البيانات (نفس inode).