هذا شرح أمر ln بشكل شامل وموسع للمبتدئين وبنفس الأسلوب، مع أمثلة كثيرة داخل بلوكات كود + توضيح الفرق بين Hard Link و Symbolic Link + حالات عملية وأخطاء شائعة.
1) ما هو أمر ln ولماذا نستخدمه؟
أمر ln يستخدم لإنشاء روابط (Links) لملف أو مجلد.
تخيل الرابط مثل “اختصار” أو “اسم إضافي” لنفس الشيء، لكن هناك نوعان:
- Hard Link (رابط صلب)
- Symbolic Link / Soft Link (رابط رمزي/لينك)
2) الصيغة العامة (Syntax)
إنشاء Hard Link
ln TARGET LINK_NAMEBashإنشاء Symbolic Link
ln -s TARGET LINK_NAMEBash3) الفرق بين Hard Link و Symbolic Link (بأبسط طريقة)
✅ Hard Link
- هو اسم إضافي لنفس الملف نفسه (نفس البيانات على القرص).
- يشترك مع الملف الأصلي في inode (رقم تعريف الملف).
- إذا حذفت “اسمًا” منها، يبقى الملف موجود طالما يوجد اسم آخر (Hard link آخر).
- لا يعمل عادةً مع المجلدات (لأسباب حماية وتفادي حلقات).
- لا يمكنه عبور أنظمة ملفات مختلفة (مثل قسم مختلف / partition مختلف).
✅ Symbolic Link (Symlink)
- هو ملف صغير يحتوي مسار الهدف (يشبه اختصار في ويندوز).
- يمكنه أن يشير إلى ملف أو مجلد.
- يمكنه عبور أنظمة ملفات مختلفة.
- إذا تم نقل/حذف الهدف → يصبح الرابط مكسور (broken).
4) فهم سريع لـ inode ولماذا يهم؟
الـ inode هو “بطاقة هوية” للملف داخل نظام الملفات، يحتوي معلومات مثل:
- مكان البيانات على القرص
- الصلاحيات
- المالك
- الخ…
لفهم hard links عمليًا نستخدم:
ls -liBash
-iيظهر رقم الـ inode.
5) إنشاء Hard Link (مع مثال عملي)
خطوة 1: إنشاء ملف وكتابة محتوى
cd ~/project
echo "Hello from original" > file1.txtBashخطوة 2: إنشاء hard link
ln file1.txt file1_hardlink.txtBashخطوة 3: تحقق بالـ inode وعدد الروابط
ls -li file1.txt file1_hardlink.txt
ls -l file1.txt file1_hardlink.txtBashماذا تتوقع؟
- نفس رقم الـ inode للملفين
- في
ls -lالعمود الثاني (عدد الروابط) غالبًا يصبح 2
خطوة 4: جرّب تعدّل المحتوى
echo "Updated content" > file1.txt
cat file1.txt
cat file1_hardlink.txtBashسترى نفس المحتوى في الاثنين لأنهما “نفس الملف” فعليًا باسمين مختلفين.
خطوة 5: جرّب حذف الأصل
rm file1.txt
ls -l file1_hardlink.txt
cat file1_hardlink.txtBashالمفاجأة: الملف ما زال موجودًا عبر الـ hard link.
لأن البيانات لا تُحذف إلا عندما يصبح عدد الروابط = 0.
6) إنشاء Symbolic Link (Symlink) مع مثال عملي
خطوة 1: إنشاء ملف
cd ~/project
echo "Hello from file2" > file2.txtBashخطوة 2: إنشاء symlink
ln -s file2.txt file2_symlink.txtBashخطوة 3: تحقق
ls -l file2.txt file2_symlink.txtBashستلاحظ:
- السطر الخاص بالرابط يبدأ بحرف
l - ويظهر سهم مثل:
file2_symlink.txt -> file2.txt
خطوة 4: جرّب حذف الهدف
rm file2.txt
cat file2_symlink.txtBashهنا سيظهر خطأ لأن الرابط أصبح مكسور.
افحصه:
ls -l file2_symlink.txtBash7) Symlink للمجلدات (ميزة مهمة)
بعكس hard link، الـ symlink يشتغل مع المجلدات:
cd ~/project
mkdir -p dir1
ln -s dir1 dir1_link
ls -l dir1 dir1_linkBashيمكنك الدخول للرابط كأنه مجلد:
cd dir1_link
pwdBash8) مسارات نسبية vs مطلقة في symlink (نقطة مهمة)
أ) رابط بمسار نسبي (عادةً أفضل داخل نفس المشروع)
ln -s file2.txt link_to_file2Bashب) رابط بمسار مطلق (أحيانًا أقوى لكنه أقل قابلية للنقل)
ln -s /home/labex/project/file2.txt abs_linkBashإذا نقلت المشروع لمكان آخر، الرابط المطلق غالبًا ينكسر، بينما النسبي قد يبقى صحيحًا.
9) استبدال رابط موجود أو ملف موجود (خيارات مهمة)
أ) -f إجبار الاستبدال
ln -sf target.txt linknameBashب) -i يسأل قبل الاستبدال
ln -si target.txt linknameBashج) إنشاء رابط داخل مجلد باسم تلقائي (مفيد)
ln -s file2.txt ~/project/somedir/Bash10) متى أستخدم Hard Link ومتى Symlink؟
استخدم Hard Link عندما:
- تريد اسمين لنفس الملف داخل نفس نظام الملفات
- تريد أن يبقى الملف موجودًا حتى لو حذف الاسم الأصلي
- لا تحتاج الإشارة لمجلد
استخدم Symlink عندما:
- تريد “اختصار” لملف أو مجلد
- تريد رابطًا بين أماكن مختلفة
- تريد ربط ملفات إعدادات (مثل dotfiles)
- تريد مرونة أعلى
11) أخطاء شائعة وحلولها
أ) خطأ: “hard link not allowed for directory”
لأن hard links للمجلدات ممنوعة غالبًا.
✅ الحل: استخدم symlink:
ln -s dir1 dir1_linkBashب) رابط symlink مكسور
إذا نقلت الهدف أو حذفته.
✅ تحقق:
ls -l linknameBashثم صحح الرابط:
ln -sf new_target linknameBashج) “File exists”
يعني الرابط/الملف موجود.
✅ استخدم:
ln -sf target linknameBash12) تدريب عملي سريع (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).