אנחנו משתמשים בקבצים ובתיקיות מדי יום, אבל בדרך כלל חושבים עליהם בצורה חזותית: תיקייה היא מעין קופסה, קובץ נמצא בתוכה, והנתיב הוא הכתובת שלו.
זהו תיאור נוח, אך מאחורי הקלעים מערכת הקבצים פועלת באופן מעט שונה ומעניין הרבה יותר.
קובץ הוא לא השם שלו
נניח שיש לנו קובץ בשם:
report.pdfקל לחשוב שהשם הוא חלק בלתי נפרד מהקובץ. בפועל, השם הוא בדרך כלל רק הדרך שבה תיקייה מסוימת מפנה אל הקובץ.
כאשר משנים את השם:
report.pdfל:
final-report.pdfתוכן הקובץ לא חייב להשתנות כלל. ברוב המקרים מערכת הקבצים רק מעדכנת את הרשומה שמקשרת בין השם לבין הקובץ.
גם שינוי הסיומת אינו ממיר את הקובץ. אם נשנה:
photo.pngל:
photo.pdfהתוכן הפנימי עדיין עשוי להיות תמונת PNG. הסיומת היא חלק מהשם, לא מנגנון המרה.
תוכנות יכולות לזהות את סוג הקובץ באמצעות הסיומת, אבל גם באמצעות חתימת הקובץ, מבנה התוכן או MIME type.
מהי תיקייה?
תיקייה אינה בהכרח קופסה פיזית שבתוכה נמצאים הקבצים.
אפשר לחשוב עליה כעל טבלה שמקשרת שמות לאובייקטים במערכת הקבצים:
report.pdf → קובץ מסוים
photo.jpg → קובץ אחר
Projects → תיקייה אחרתכאשר אנחנו פותחים תיקייה, מערכת ההפעלה מציגה לנו את השמות שנרשמו בה ואת האובייקטים שאליהם הם מפנים.
מהו נתיב?
נתיב הוא הוראת ניווט שמסבירה למערכת כיצד להגיע לקובץ או לתיקייה.
לדוגמה:
/Users/evyatar/Documents/report.pdfהמערכת קוראת את הנתיב שלב אחר שלב:
/
└── Users
└── evyatar
└── Documents
└── report.pdfהנתיב אינו הקובץ עצמו. הוא הדרך להגיע אליו.
אם מעבירים את הקובץ מ:
/Users/evyatar/Documents/report.pdfאל:
/Users/evyatar/Desktop/report.pdfהדבר היחיד שבוודאות השתנה הוא הנתיב.
המיקום הפיזי של הנתונים על הדיסק לא בהכרח השתנה. כאשר ההעברה מתבצעת בתוך אותה מערכת קבצים, לעיתים מספיק לעדכן את הרשומות בלבד. לכן אפשר להעביר קובץ גדול מאוד כמעט באופן מיידי.
בהעברה בין כוננים או מערכות קבצים שונות, בדרך כלל צריך להעתיק את התוכן ולאחר מכן למחוק את המקור.
נתיב מוחלט ונתיב יחסי
נתיב מוחלט מתחיל מנקודת השורש של מערכת הקבצים.
ב-Linux וב-macOS:
/Users/evyatar/Documents/report.pdfב-Windows:
C:\Users\Evyatar\Documents\report.pdfנתיב יחסי מחושב ביחס לתיקייה שבה אנחנו נמצאים כרגע.
אם התיקייה הנוכחית היא:
/Users/evyatarאז הנתיב היחסי:
Documents/report.pdfמוביל לאותו קובץ.
המשמעות של `.` ושל `..`
בנתיבים יחסיים קיימים שני סימונים חשובים.
`.` פירושו התיקייה הנוכחית.
`..` פירושו תיקיית האב, כלומר תיקייה אחת למעלה.
אם אנחנו נמצאים כאן:
/Users/evyatar/Documentsהנתיב:
./report.pdfמוביל אל:
/Users/evyatar/Documents/report.pdfוהנתיב:
../Desktop/photo.jpgעולה מ-`Documents` אל `evyatar`, נכנס אל `Desktop`, ומגיע אל:
/Users/evyatar/Desktop/photo.jpgנרמול נתיבים
לעיתים נתיב מכיל חלקים מיותרים:
/Users/evyatar/Documents/Projects/../report.pdfהכניסה אל `Projects` והיציאה ממנה באמצעות `..` מבטלות זו את זו, ולכן הנתיב מתנרמל ל:
/Users/evyatar/Documents/report.pdfבאופן דומה:
/Users/evyatar/./Documents/report.pdfזהה ל:
/Users/evyatar/Documents/report.pdfחשוב לעקוב אחר הנתיב לפי הסדר. לדוגמה:
../docs/../imagesאינו זהה ל:
../../imagesבמקרה הראשון אנחנו עולים תיקייה אחת, נכנסים אל `docs`, ואז יוצאים ממנה. הכניסה והיציאה מ-`docs` מתבטלות.
במקרה השני אנחנו עולים בפועל שתי תיקיות.
inode ו-Hard Links
במערכות Unix-like, כגון Linux ו-macOS, קובץ מיוצג באמצעות מבנה פנימי שנקרא בדרך כלל `inode`.
ה-inode שומר מידע כגון:
- גודל הקובץ.
- הרשאות.
- בעלים.
- זמני שינוי.
- מיקומי הנתונים בדיסק.
שם הקובץ בדרך כלל אינו נשמר בתוך ה-inode. במקום זאת, התיקייה מקשרת בין שם לבין inode:
report.txt → inode 48291אפשר ליצור שני שמות שונים שמפנים לאותו inode:
report.txt → inode 48291
backup.txt → inode 48291זה נקרא `Hard Link`.
אלה אינם שני עותקים עצמאיים. שני השמות מפנים לאותו תוכן. לכן שינוי הקובץ דרך `report.txt` ייראה גם כאשר פותחים את `backup.txt`.
אם מוחקים את `report.txt`, התוכן לא נמחק כל עוד `backup.txt` עדיין מפנה אליו.
רק כאשר לא נשארים קישורים לקובץ ואף תהליך אינו מחזיק אותו פתוח, מערכת ההפעלה יכולה לשחרר את המקום שבו נשמר התוכן.
קבצים מוסתרים
ב-Linux וב-macOS, קובץ ששמו מתחיל בנקודה מוצג בדרך כלל כמוסתר:
.env
.gitignore
.profileהנקודה היא פשוט חלק משם הקובץ. היא אינה אומרת שהקובץ הוא בהכרח קובץ מערכת או שאסור למחוק אותו.
כלים רבים פשוט בוחרים שלא להציג קבצים כאלה כברירת מחדל.
סיכום
ההבחנה בין קובץ, שם, תיקייה ונתיב עוזרת להבין פעולות רבות שנראות בתחילה מסתוריות:
- שינוי שם לא בהכרח משנה את התוכן.
- שינוי סיומת אינו ממיר את סוג הקובץ.
- העברת קובץ אינה תמיד העתקה פיזית.
- נתיב הוא הוראת ניווט, לא הקובץ עצמו.
- `.` מייצג את התיקייה הנוכחית ו-`..` את תיקיית האב.
- שני שמות יכולים להפנות לאותו תוכן באמצעות Hard Link.
- קובץ מוסתר הוא לעיתים רק קובץ ששמו מתחיל בנקודה.
ברגע שמבינים את המודל הזה, מערכת הקבצים מפסיקה להיראות כמו אוסף תיקיות גרפי והופכת למבנה מסודר של שמות, קישורים ונתונים.