שיעור 10 of 22
בתהליך

תיקיית בית וניווט מתקדם

תיקיות בית

זהו דוגמה למערכת קבצים רגילה בלינוקס:

$ tree -L 1 /
/
├── bin
├── boot
├── cdrom
├── dev
├── etc
├── home
├── lib
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin
├── srv
├── sys
├── tmp
├── usr
└── var
    

רוב התיקיות הללו עקביות בכל מערכות הלינוקס. החל משרתים ועד מחשבי-על ומערכות משובצות קטנות, משתמש לינוקס מנוסה יכול להיות בטוח שהוא ימצא את הפקודה ls בתוך /bin, יוכל לשנות את תצורת המערכת על ידי עריכת קבצים ב-/etc, ולקרוא יומני מערכת ב-/var. המיקום הסטנדרטי של קבצים ותיקיות אלו מוגדר על ידי Filesystem Hierarchy Standard (FHS), אשר יידון בשיעור מאוחר יותר. תלמדו עוד על תוכן התיקיות הללו ככל שתמשיכו ללמוד על לינוקס, אך בינתיים, כדאי לדעת ש:

  • שינויים שתבצעו במערכת הקבצים הראשית ישפיעו על כל המשתמשים, ו
  • שינוי קבצים במערכת הקבצים הראשית ידרוש הרשאות מנהל מערכת.

זה אומר שמשתמשים רגילים יהיו מוגבלים משינוי קבצים אלה, וייתכן שגם לא תהיה להם גישה לקרוא את הקבצים האלה. נעסוק בנושא ההרשאות בסעיף מאוחר יותר.

כעת נתמקד בתיקיית /home, שאמורה להיות מעט מוכרת בשלב זה:

$ tree -L 1 /home
/home
├── user
├── michael
└── lara
    

במערכת הדוגמה שלנו יש שלושה משתמשים רגילים, ולכל אחד מהמשתמשים יש מיקום ייעודי משלו, שבו הם יכולים ליצור ולשנות קבצים ותיקיות מבלי להשפיע על השכנים שלהם. לדוגמה, בשיעור הקודם עבדנו עם מבנה הקבצים הבא:

הנה דוגמה למבנה מערכת קבצים בלינוקס:

$ tree /home/user
user
└── Documents
    ├── Mission-Statement
    └── Reports
        └── report2018.txt
    

בפועל, מערכת הקבצים עשויה להיראות כך:

$ tree /home
/home
├── user
│   └── Documents
│       ├── Mission-Statement
│       └── Reports
│           └── report2018.txt
├── michael
│   ├── Documents
│   │   └── presentation-for-clients.odp
│   └── Music
    

…וכן הלאה עבור lara.

בלינוקס, /home דומה לבניין דירות. משתמשים רבים יכולים להחזיק כאן מקום, כשהם מופרדים לתיקיות ייעודיות. ניהול המערכת והתחזוקה של המבנה נמצאים באחריותו של המשתמש root, שמשמש כ”מנהל העל” של המערכת.

הנתיב היחסי המיוחד לבית

כאשר אתה פותח מושב טרמינל חדש בלינוקס, אתה רואה שורת פקודה דומה לזו:

user@hostname ~ $
    

הטילדה (~) מייצגת את תיקיית הבית שלך. אם תשתמש בפקודת ls, תקבל פלט דומה לזה:

$ cd ~
$ ls
Documents
    

השווה זאת למערכת הקבצים שתוארה למעלה כדי להבין את המבנה.

בוא נחשוב על לינוקס כעל בניין דירות, כאשר משתמשים רבים מתגוררים בתיקיית /home. תיקיית הבית של המשתמש user תהיה שונה מזו של המשתמש michael. ניתן להדגים זאת באמצעות הפקודה su לשם החלפת משתמשים:

user@hostname ~ $ pwd
/home/user
user@hostname ~ $ su - michael
Password:
michael@hostname ~ $ pwd
/home/michael
    

המשמעות של ~ משתנה בהתאם למי המשתמש הנוכחי. עבור michael, הנתיב המלא של ~ הוא /home/michael, ועבור lara הוא /home/lara, וכן הלאה.

נתיבים יחסיים לבית

שימוש ב-~ בפקודות הוא נוח כל עוד אינך עובר בין משתמשים. ניקח לדוגמה את המשתמש user במושב חדש:

$ ls
Documents
$ cd Documents
$ ls
Mission-Statement
Reports
$ cd Reports
$ ls
report2018.txt
$ cd ~
$ ls
Documents
    

שים לב שמשתמשים תמיד מתחילים מושב חדש בתיקיית הבית שלהם. בדוגמה הזו, המשתמש user עבר לתיקיית המשנה Documents/Reports, וחזר לתיקיית הבית עם הפקודה cd ~. אפשר לבצע את אותה פעולה גם באמצעות הפקודה cd ללא ארגומנטים:

$ cd Documents/Reports
$ pwd
/home/user/Documents/Reports
$ cd
$ pwd
/home/user
    

דבר אחרון שיש לציין: ניתן לגשת לתיקיות הבית של משתמשים אחרים על ידי ציון שם המשתמש אחרי הסימן ~. לדוגמה:

$ ls ~michael
Documents
Music
    

שים לב שזה יעבוד רק אם michael נתן לנו הרשאות לצפות בתיקיית הבית שלו.

כעת ניקח דוגמה בה המשתמש michael רוצה לצפות בקובץ report2018.txt שבתיקיית הבית של user. בהנחה ש michael קיבל הרשאה לעשות זאת, הוא יכול להשתמש בפקודת less:

$ less ~user/Documents/Reports/report2018.txt
    

כל נתיב שמכיל את הסימן ~ נקרא “נתיב יחסי לתיקיית הבית”.

קבצים ותיקיות מוסתרים

בשיעור הקודם הצגנו את האפשרות -a עבור הפקודה ls. השתמשנו ב-ls -a כדי להציג את שני הנתיבים היחסיים המיוחדים: . ו-... אפשרות -a תציג את כל הקבצים והתיקיות, כולל קבצים ותיקיות מוסתרים.

$ ls -a ~
.
..
.bash_history
.bash_logout
.bash-profile
.bashrc
Documents
    

קבצים ותיקיות מוסתרים תמיד יתחילו בנקודה (.). כברירת מחדל, תיקיית הבית של המשתמש תכלול קבצים מוסתרים רבים. קבצים אלה משמשים לרוב להגדרת הגדרות תצורה ספציפיות למשתמש, ורק משתמש מנוסה צריך לשנות אותם.

האפשרות לרשימה מפורטת

לפקודת ls יש אפשרויות רבות לשינוי התנהגותה. הבה נבחן אחת מהאפשרויות הנפוצות ביותר:

$ ls -l
-rw-r--r-- 1 user staff 3606 Jan 13 2017 report2018.txt
    

האפשרות -l יוצרת רשימה מפורטת. כל קובץ ותיקייה יופיעו בשורה נפרדת, אך יוצג מידע נוסף אודות כל קובץ ותיקייה.

-rw-r--r--
סוג הקובץ והרשאות הקובץ. שים לב שקובץ רגיל יתחיל בקו מקף (-), ותיקייה תתחיל ב-d.

1
מספר הקישורים לקובץ.

user staff
מציין את בעלות הקובץ. user הוא בעל הקובץ, והקובץ משויך גם לקבוצת staff.

3606
גודל הקובץ בבתים.

Jan 13 2017
חותמת הזמן של השינוי האחרון בקובץ.

report2018.txt
שם הקובץ.

נושאים כמו בעלות, הרשאות וקישורים יכוסו במקטעים עתידיים. כפי שניתן לראות, הגרסה המפורטת של הפקודה ls היא לעיתים קרובות עדיפה על ברירת המחדל.

אפשרויות נוספות לפקודת ls

להלן כמה מהדרכים הנפוצות לשימוש בפקודת ls. כפי שניתן לראות, ניתן לשלב בין אפשרויות שונות על מנת לקבל את התוצאה הרצויה:

$ ls -lh
    

שילוב רשימה מפורטת עם גדלים קריאים למשתמש. נקבל סיומות כמו M עבור מגהבייטים או K עבור קילובייטים.

$ ls -d */
    

האפשרות -d תציג רק תיקיות ולא את תכולתן. השילוב עם */ יציג רק תיקיות משנה ולא קבצים.

$ ls -lt
    

שילוב רשימה מפורטת עם אפשרות למיון לפי זמן שינוי. הקבצים עם השינויים האחרונים יופיעו בראש הרשימה, והקבצים הישנים יהיו בתחתית. ניתן גם להפוך את הסדר עם:

$ ls -lrt
    

שילוב רשימה מפורטת עם מיון לפי זמן שינוי, בשילוב עם -r שהופך את הסדר. כעת הקבצים עם השינויים האחרונים יופיעו בתחתית הרשימה. בנוסף, ניתן למיין לפי זמן גישה או זמן סטטוס.

$ ls -lX
    

שילוב רשימה מפורטת עם מיון לפי סיומת הקבצים. לדוגמה, כל הקבצים שמסתיימים ב-.txt יופיעו יחד, כל הקבצים שמסתיימים ב-.jpg יופיעו יחד, וכו’.

$ ls -S
    

האפשרות -S ממיינת לפי גודל הקובץ, באופן דומה ל--t ו--X שממיינים לפי זמן וסיומת בהתאמה. הקבצים הגדולים ביותר יופיעו ראשונים, והקטנים אחרונים. שים לב שתוכן תיקיות המשנה לא נכלל במיון.

$ ls -R
    

האפשרות -R תגרום לפקודת ls להציג רשימה רקורסיבית. מה זה אומר?

רקורסיה בבש

רקורסיה מתייחסת למצב שבו “משהו מוגדר במונחים של עצמו”. רקורסיה היא מושג חשוב מאוד במדעי המחשב, אך כאן משמעותו פשוטה בהרבה. נבחן את הדוגמה שלנו מקודם:

$ ls ~
Documents
    

ידוע לנו מקודם שלמשתמש יש תיקיית בית, ובתיקייה זו יש תיקיית משנה אחת. עד כה ls הציגה לנו רק את הקבצים ותיקיות המשנה של מיקום, אך לא יכלה להציג את תוכן תיקיות המשנה.

במהלך השיעורים הללו השתמשנו בפקודה tree כאשר רצינו להציג את תוכן תיקיות רבות. למרבה הצער, tree אינה אחת מהכלים הבסיסיים של לינוקס ולכן אינה תמיד זמינה. השווה את פלט tree עם פלט ls -R בדוגמאות הבאות:

$ tree /home/user
user
└── Documents
  ├── Mission-Statement
  └── Reports
  └── report2018.txt

$ ls -R ~
/home/user/:
Documents

/home/user/Documents:
Mission-Statement
Reports

/home/user/Documents/Reports:
report2018.txt
    

כפי שניתן לראות, עם האפשרות הרקורסיבית, אנו מקבלים רשימה ארוכה יותר של קבצים. למעשה, זה כאילו הרצנו את הפקודה ls בתיקיית הבית של המשתמש, ונתקלנו בתיקיית משנה אחת. לאחר מכן, נכנסנו לתיקיית המשנה והרצנו שוב את הפקודה ls. מצאנו את הקובץ Mission-Statement ותיקיית משנה נוספת בשם Reports. ושוב, נכנסנו לתיקיית המשנה והרצנו את הפקודה ls שוב.

בעצם, הרצת ls -R היא כמו להגיד לבש: “הרץ ls כאן, וחזור על הפקודה בכל תיקיית משנה שתמצא”.תרגילים מודרכים

  1. השתמש במבנה הקבצים הבא כדי לענות על שלוש השאלות הבאות:
          /
          ├── etc/
          │   ├── network/
          │   │   └── interfaces/
          │   ├── systemd/
          │   │   ├── resolved.conf
          │   │   ├── system/
          │   │   ├── system.conf
          │   │   ├── user/
          │   │   └── user.conf
          │   └── udev/
          │   ├── rules.d
          │   └── udev.conf
          └── home/
            ├── lost+found/
            ├── user/
            │ └── Documents/
            └── michael/
            └── Music/
        
    • איזו פקודה תנווט לתוך התיקייה network ללא קשר למיקום הנוכחי שלך?
    • איזו פקודה יכול המשתמש להקליד כדי לנווט לתיקיית Documents שלו מתוך /etc/udev? השתמש בנתיב הקצר ביותר האפשרי.
    • איזו פקודה יכול המשתמש להקליד כדי לנווט לתיקיית Music של michael? השתמש בנתיב הקצר ביותר האפשרי.
  2. התבונן בתוצאות הבאות של הפקודה ls -lh וענה על שתי השאלות הבאות:
          drwxrwxrwx 5 eric eric 4.0K Apr 26 2011 China/
          -rwxrwxrwx 1 eric eric 1.5M Jul 18 2011 img_0066.jpg
          -rwxrwxrwx 1 eric eric 1.5M Jul 18 2011 img_0067.jpg
          -rwxrwxrwx 1 eric eric 1.6M Jul 18 2011 img_0074.jpg
          -rwxrwxrwx 1 eric eric 1.8M Jul 18 2011 img_0075.jpg
          -rwxrwxrwx 1 eric eric 46K Jul 18 2011 scary.jpg
          -rwxrwxrwx 1 eric eric 469K Jan 29 2018 Screenshot from 2017-08-13 21-22-24.png
          -rwxrwxrwx 1 eric eric 498K Jan 29 2018 Screenshot from 2017-08-14 21-18-07.png
          -rwxrwxrwx 1 eric eric 211K Jan 29 2018 Screenshot from 2018-01-06 23-29-30.png
          -rwxrwxrwx 1 eric eric 150K Jul 18 2011 tobermory.jpg
          drwxrwxrwx 6 eric eric 4.0K Apr 26 2011 Tokyo/
          -rwxrwxrwx 1 eric eric 1.4M Jul 18 2011 Toronto 081.jpg
          -rwxrwxrwx 1 eric eric 1.4M Jul 18 2011 Toronto 085.jpg
          -rwxrwxrwx 1 eric eric 944K Jul 18 2011 Toronto 152.jpg
          -rwxrwxrwx 1 eric eric 728K Jul 18 2011 Toronto 173.jpg
          drwxrwxrwx 2 eric eric 4.0K Jun 5 2016 Wallpapers/
        
    • כאשר אתה מריץ את הפקודה ls -lrS, איזה קובץ יופיע בתחילת הרשימה?
    • תאר מה אתה מצפה לראות כתוצאה מהפקודה ls -ad */.

תרגול חוקר

  1. הרץ את הפקודה ls -lh בספרייה המכילה תת-ספריות. שים לב לגודל המפורט של הספריות הללו. האם הגדלים נראים לך נכונים? האם הם מייצגים במדויק את התוכן של כל הקבצים שבתוך הספרייה?
  2. הנה פקודה חדשה לנסות: du -h. הרץ את הפקודה ותאר את הפלט שהיא נותנת לך.
  3. ברוב המערכות של לינוקס, אתה יכול להקליד ll ולקבל את אותו פלט כמו אם היית מקליד ls -l. עם זאת, שים לב ש-ll היא לא פקודה. לדוגמה, man ll ייתן לך הודעה שאין ערך ידני עבור הפקודה הזו. זהו דוגמה ל-“alias”. למה עלול alias להיות שימושי למשתמש?

סיכום

במעבדה זו, למדת:

  • שלכל משתמש בלינוקס תהיה ספריית בית
  • ניתן לגשת לספריית הבית של המשתמש הנוכחי באמצעות ~
  • כל נתיב קובץ המשתמש ב-~ נקרא “נתיב יחסית לספריית הבית”

גם למדת על כמה מהדרכים הנפוצות ביותר לשימוש בפקודה ls:

  • -a (הכול) – מציג את כל הקבצים/ספריות, כולל מוסתרים
  • -d (ספריות) – מציג ספריות בלבד, לא את התוכן שלהן
  • -h (פורמט קריא לבני אדם) – מציג את גדלי הקבצים בפורמט קריא
  • -l (רשימה ארוכה) – מספק פרטים נוספים, קובץ/ספרייה אחד בכל שורה
  • -r (הפוך) – הופך את סדר המיון
  • -R (רקורסיבי) – מציג כל קובץ, כולל קבצים בכל תת-ספרייה
  • -S (גודל) – ממיין לפי גודל הקובץ
  • -t (זמן) – ממיין לפי זמן השינוי
  • -X (סיומת קובץ) – ממיין לפי סיומת קובץ

תשובות לתרגילים המודרכים

1. השתמש במבנה הקבצים הבא כדי לענות על שלוש השאלות הבאות:

/
├── etc/
│   ├── network/
│   │   └── interfaces/
│   ├── systemd/
│   │   ├── resolved.conf
│   │   ├── system/
│   │   ├── system.conf
│   │   ├── user/
│   │   └── user.conf
│   └── udev/
│   ├── rules.d
│   └── udev.conf
└── home/
  ├── lost+found/
  ├── user/
  │ └── Documents/
  └── michael/
  └── Music/
    

◦ מהי הפקודה שתנווט לתיקיית network ללא קשר למיקום הנוכחי?
cd /etc/network

◦ מהי הפקודה שיכול משתמש להקליד כדי לנווט לתיקיית Documents שלו מ-/etc/udev? השתמש במסלול הקצר ביותר.
cd ~/Documents

◦ מהי הפקודה שיכול משתמש להקליד כדי לנווט לתיקיית Music של מיכאל? השתמש במסלול הקצר ביותר.
cd ~michael/Music

2. שקול את הפלט הבא של הפקודה ls -lh כדי לענות על שתי השאלות הבאות. שים לב כי תיקיות מסומנות עם d בתחילת השורה.

drwxrwxrwx 5 eric eric 4.0K Apr 26 2011 China/
-rwxrwxrwx 1 eric eric 1.5M Jul 18 2011 img_0066.jpg
-rwxrwxrwx 1 eric eric 1.5M Jul 18 2011 img_0067.jpg
-rwxrwxrwx 1 eric eric 1.6M Jul 18 2011 img_0074.jpg
-rwxrwxrwx 1 eric eric 1.8M Jul 18 2011 img_0075.jpg
-rwxrwxrwx 1 eric eric 46K Jul 18 2011 scary.jpg
-rwxrwxrwx 1 eric eric 469K Jan 29 2018 Screenshot from 2017-08-13 21-22-24.png
-rwxrwxrwx 1 eric eric 498K Jan 29 2018 Screenshot from 2017-08-14 21-18-07.png
-rwxrwxrwx 1 eric eric 211K Jan 29 2018 Screenshot from 2018-01-06 23-29-30.png
-rwxrwxrwx 1 eric eric 150K Jul 18 2011 tobermory.jpg
drwxrwxrwx 6 eric eric 4.0K Apr 26 2011 Tokyo/
-rwxrwxrwx 1 eric eric 1.4M Jul 18 2011 Toronto 081.jpg
-rwxrwxrwx 1 eric eric 1.4M Jul 18 2011 Toronto 085.jpg
-rwxrwxrwx 1 eric eric 944K Jul 18 2011 Toronto 152.jpg
-rwxrwxrwx 1 eric eric 728K Jul 18 2011 Toronto 173.jpg
drwxrwxrwx 2 eric eric 4.0K Jun 5 2016 Wallpapers/
    

◦ כאשר תפעיל את הפקודה ls -lrS, איזה קובץ יופיע ראשון?
התיקיות כולן בגודל 4.0K, שהוא הגודל הקטן ביותר. ls יסדר את התיקיות באלפבית כברירת מחדל. התשובה הנכונה היא הקובץ scary.jpg.

◦ מה הפלט שצפוי להופיע עבור הפקודה ls -ad */?
הפקודה תציג את כל תיקיות המשנה, כולל תיקיות נסתרות.

תשובות לתרגילים החוקרים

1. הפעל את הפקודה ls -lh בתיקייה שמכילה תיקיות משנה. האם גודלי הקבצים שמופיעים נראים לך נכונים? האם הם מייצגים במדויק את התוכן של כל הקבצים בתוך התיקייה?

לא, הם לא מדויקים. לכל תיקייה יש גודל קובץ רשום של 4096 בתים. זאת מפני שתיקיות הן הפשטה: הן לא קיימות כמבנה עץ בדיסק. כשאתה רואה תיקייה ברשימה, אתה רואה קישור לרשימה של קבצים. גודל הקישורים האלה הוא 4096 בתים.

2. הנה פקודה חדשה לנסות: du -h. הפעל את הפקודה ותאר את הפלט שהיא נותנת לך.

הפקודה du תייצר רשימה של כל הקבצים והתיקיות, ותציג את הגודל של כל אחד מהם. לדוגמה, du -s תציג את גודל הקובץ של כל הקבצים, התיקיות ותיקיות המשנה עבור מיקום מסוים.

3. ברוב מערכות לינוקס, ניתן להקליד ll ולקבל את אותו הפלט כמו אם היית מקליד ls -l. שים לב עם זאת ש-ll היא לא פקודה. לדוגמה, man ll יציג את ההודעה שאין ערך במדריך עבור הפקודה. מה זה מרמז לך על תכונה של שורת הפקודה?

ll היא אליאס (alias) של ls -l. בבש, ניתן להשתמש באליאסים כדי לפשט פקודות שמשתמשים בהן לעיתים קרובות. ll מוגדר לעיתים קרובות מראש בלינוקס, אך ניתן ליצור אליאסים משלך גם כן.