למידת אופרטורי בדיקת קבצי Bash עם דוגמאות

בַּשׁ הוּא גמיש למדי ומציע אפשרויות שונות לבדיקת קבצים. ואם אתה מחפש דרך לבדוק את הקבצים שלך, אופרטורי בדיקת הקבצים של Bash יובילו אותך למקומות שונים.

במדריך זה, תלמד על אופרטורים שונים לבדיקת קבצים וכיצד להשתמש בהם כדי לבדוק האם קובץ קיים, ניתן לקרוא אותו, האם הוא ריק וכו'

קרא וחבר את אופרטורי בדיקת הקבצים של Bash!

דרישות מוקדמות

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

  • A Linux system with Bash installed – This tutorial uses Ubuntu 20.04.

רוב ההפצות של Linux מתקינות את Bash כברירת מחדל. אם אתה משתמש בווינדוס, תוכל להתקין את תת-מערכת ההפעלה של Windows עבור Linux (WSL) כדי לקבל מסוף Bash.

  • A user account with sudo privileges to run commands as root – This tutorial uses a root account for simplicity. But using a non-root user with sudo access is always recommended.

מהם אופרטורי בדיקת קובץ Bash?

לפני שאתה מתעסק עם האופרטורים לבדיקת קובץ, כדאי להעיף מבט על איך הם פועלים. אופרטורי בדיקת קובץ מאפשרים לך לבדוק פרטים שונים של קובץ, כמו האם הקובץ קיים, האם אפשר לקרוא/לכתוב לתוכו, וכו'

שימוש באופרטורי בדיקת קובץ יכול לעזור למניעת שגיאות בתסריטי Bash שלך. הקוד למטה הוא תבנית להצהרת if. ההצהרה if-else היא כלי עוצמתי שתראה לעיתים קרובות בתסריטים של Bash.

זכור שהחלקים then ו-else בבלוק הקוד אינם חובה. ניתן להשתמש בהצהרת if גם בלעדיהם.

# מייצג את הקובץ שברצונך לבדוק. 
# החלף את file_name בשם הקובץ המטרה שברצונך לבדוק.
FILE="file_name"
# אופרטור - האופרטור לבדיקת הקובץ להשתמש בו.
if [ Operator $FILE ]

then
 # משימות לביצוע אם האופרטור מחזיר ערך נכון.
 do something

else
 # משימות לביצוע אם האופרטור מחזיר ערך שקר.
 do something

fi

בדיקה האם קובץ קיים

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

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

כדי לבדוק האם קובץ כבר קיים:

1. פתח את הטרמינל שלך והרץ את הפקודה touch ליצירת קובץ test.txt החדש. פקודה זו אינה מחזירה פלט, אך תאמת את הקיום של הקובץ בשלב הבא.

touch test.txt

2. לאחר מכן, הרץ את הפקודה ls הבאה כדי לרשום את הקובץ שנוצר חדש (test.txt) בתיקיית העבודה שלך.

ls -al test.txt

הפלט למטה מאמת שיצרת בהצלחה את קובץ test.txt.

עכשיו שיש לך קובץ בדיקה, אתה יכול להשתמש בבלוק הקוד המקורי בתסריט Bash כדי לבדוק האם הקובץ קיים בשלבים הבאים.

Listing the newly-created file

3. הרץ את הפקודה הבאה כדי ליצור (touch) ולפתוח קובץ תסריט (if_file_exists.sh) חדש בעורך הטקסט המועדף עליך (nano).

touch if_file_exists.sh && nano if_file_exists.sh

4. עכשיו, הזן את הקוד למטה לתוך הקובץ החדש שלך if_file_exists.sh , שמור את הקובץ וסגור את העורך.

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

#!/bin/bash


  
FILE="test.txt"


if [ -e $FILE ]
then
  
  echo "$FILE exists"
else
  
    
  echo "$FILE does not exist, creating new file" && touch test.txt
fi

5. הפעל את הפקודה הבאה כדי לבצע את הסקריפט החדש שלך (if_file_exists.sh)

bash if_file_exists.sh

אם הכל הולך כראוי, תראה את ההודעה "test.txt קיים" מודפסת בטרמינל שלך, כמו שמוצג למטה.

test.txt exists

6. לאחר מכן, הפעל את הפקודות הבאות כדי למחוק (rm -rf) את קובץ הבדיקה (test.txt) ולרשום את כל הקבצים בתיקיית העבודה שלך.

rm -rf test.txt
ls test.txt

להלן, תוכל לוודא שהקובץ test.txt אינו מופיע יותר.

Deleting the test file

7. הרץ מחדש את הפקודה הבאה כדי לבצע את הסקריפט if_file_exists.sh שלך.

מאחר וקובץ ה-test.txt אינו קיים עוד, הסקריפט יוצר קובץ חדש בשם test.txt כאשר האופרטור -e מחזיר ערך שקר.

bash if_file_exists.sh
Rerun your if_file_exists.sh script

8. לבסוף, הרץ את הפקודה ls הבאה כדי לרשום את קובץ הבדיקה test.txt בתיקיית העבודה שלך.

ls -al test.txt

הפלט למטה מאשר שהסקריפט שלך יצר קובץ חדש בשם test.txt.

Listing the new test.txt file

בדיקה אם קובץ הינו קובץ רגיל או קובץ מיוחד

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

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

פתח קובץ חדש בשם special_file.sh בעורך הטקסט שלך, הוסף את הקוד הבא ושמור את השינויים.

הקוד למטה דומה לקוד הקודם. אך בקוד זה נעשה שימוש באופרטור -f במקום באופרטור -e. האופרטור -f בודק אם קובץ מסוים (/dev/vmmon) הוא קובץ רגיל.

#!/bin/bash
# הקובץ /dev/vmmon הוא קובץ מיוחד
  # המשמש לתקשורת עם מכשירי חומרה ב-Linux.
FILE="/dev/vmmon"

# בדיקה האם הקובץ 
if [ -f $FILE ]
then
  # אם האופרטור מחזיר ערך נכון, תקבל הודעה האומרת
    # שהקובץ הוא קובץ רגיל.
  echo "$FILE is a regular file"

else
  # אם האופרטור מחזיר ערך נכון, תקבל הודעה האומרת 
    # שהקובץ אינו קיים או שהוא קובץ רגיל.
  echo "Either $FILE does not exist or is not a regular file"

fi

כעת, הפעל את הפקודה למטה כדי לבצע את הסקריפט special_file.sh שלך.

bash special_file.sh

מכיוון שהקובץ (/dev/vmmon) שצויין במשתנה FILE הוא קובץ מיוחד, תקבל את ההודעה למטה.

Checking if a file is a regular file

בדיקה אם ספרייה קיימת

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

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

1. הרץ את פקודת ה־ls למטה כדי לרשום את example-dir מתוך התיקייה העובדת.

ls -la example-dir

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

Listing the example-dir from the working directory

2. לאחר מכן, פתח קובץ חדש בשם if_dir_exists.sh בעורך הטקסט שלך, הוסף את הקוד למטה ושמור את הקובץ. הקוד הבא בודק אם תיקייה מסוימת קיימת ומבצע משימות בהתאם לערך שהאופרטור -d מחזיר.

ניתן להשיג את התוצאה הזו באותו אופן על ידי החלפת האם והאחרת באמצעות האופרטור השלילי (!). במצבי חיים אמיתיים, אופרטור ה־! יכול לעזור לכתוב סקריפט נקי ומרוכז יותר.

#!/bin/bash
# הגדר את שם התיקייה במשתנה dir
dir=example_dir

# בדוק אם התיקייה (dir) קיימת
if [ ! -d $dir ]
then
  # אם האופרטור מחזיר נכון, צור תיקייה לפי ערך המשתנה dir
  mkdir $dir
  # העתק את קובץ test.txt לתיקייה שנוצרה לאחרונה
  cp test.txt $dir
  # הדפס הודעה על המשימות שבוצעו לעיל.
  echo "The directory has been created, and the test.txt file has been copied."
else
  # אם האופרטור מחזיר שקר, 
    # פקודת ה echo מדפיסה הודעה שאומרת שהתיקייה קיימת.
  echo "Directory $dir exists"
fi

3. עכשיו, הרץ את הפקודה למטה כדי לבצע את הסקריפט שלך (if_dir_exists.sh)

bash if_dir_exists.sh

ההודעה אומרת שהספרייה נוצרה והקובץ test.txt הועתק מאחר וה-example_dir אינו קיים.

Executing the if_dir_exists.sh to test if a directory exists

4. לבסוף, הפעל את הפקודה ls נגד הספרייה example_dir כדי לאמת שהספרייה קיימת ומכילה את הקובץ test.txt.

ls -la example_dir
Confirming the example_dir directory exists and contains the test.txt file

בדיקת ריקות קובץ

כבר יש לך ידע על שלושת אופרטורי בדיקת הקובץ הנפוצים ביותר (-e, -f, ו--d) כדי לשדרג את מיומנויות התסריט שלך. אך ישנם אופרטורים נוספים שיהיה לך כיף לבדוק.

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

למה שלא להשתמש באופרטור -s כדי לבדוק אם קובץ קיים ואינו ריק? אופרטור זה מחזיר אמת אם הקובץ קיים ויש לו גודל גדול מאפס.

1. פתח קובץ חדש בשם empty_file.sh בעורך הטקסט שלך, הוסף את הקוד הבא ושמור את הקובץ.

הקוד הבא בודק אם קובץ מסוים ריק ומדפיס הודעה בהתאם לערך שמחזיר אופרטור -s.

#!/bin/bash
# מגדיר את שם קובץ היעד
FILE=test.txt

# אופרטור -s בודק אם הקובץ המטרה קיים ואינו ריק
if [ -s $FILE ]
then
  # אם האופרטור מחזיר ערך true, פקודת ה echo מדפיסה הודעה
    # שאומרת שהקובץ קיים ואינו ריק.
  echo "$FILE exists and is not empty"
else
  # אם האופרטור מחזיר ערך false, פקודת ה echo מדפיסה הודעה 
    # שאומרת שהקובץ אינו קיים או ריק.
  echo "$FILE either does not exist or is empty"
  # הוספת טקסט לקובץ היעד
  echo "This is a test. This is not an empty file" > $FILE
fi

2. עכשיו, הריצו את הפקודה להרצת הסקריפט שלכם (empty_file.sh).

bash empty_file.sh

למטה, תוכלו לראות את ההודעה שאומרת שtest.txt אינו קיים או ריק. אבל בו זמנית, הסקריפט מוסיף טקסט לקובץ test.txt.

Executing the empty_file.sh file to test if the text.txt file is empty

3. הריצו את פקודת ה-cat למטה כדי לוודא כי קובץ ה-test.txt מכיל את הטקסט שנוסף.

cat test.text
Verifying the text.txt file’s content

4. לבסוף, הריצו שוב את הפקודה להרצת הסקריפט של empty_file.sh.

bash empty_file.sh

למטה, תוכלו לראות שהפלט השתנה לtest.txt קיים ואינו ריק מאז שבקובץ test.txt כעת קיים טקסט ויש לו גודל גדול מאפס (0).

Rerunning the empty_file.sh script to check if the test.txt file is empty

בדיקה אם קובץ קיים וניתן לקריאה

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

להדגים בדיקה אם קובץ קיים וניתן לקריאה:

1. הפעל את הפקודה הבאה כדי להתחבר לחשבון משתמש אחר (ata).

su - ata

התיק משתנה ($) לצורך הצגת שהתחברת כמשתמש אחר.

Logging in to another user account

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

2. לאחר התחברות, צור קובץ חדש בשם readable_file.sh בעזרת עורך הטקסט שלך

הוסף את הקוד הבא לקובץ readable_file.sh, ושמור את השינויים. הקוד בודק האם קובץ בשם test.txt בתיקיית /root קיים וניתן לקריאה.

#!/bin/bash
# הגדר את הקובץ היעד
FILE=test.txt

# בדוק האם הקובץ היעד ניתן לקריאה. 
# ניתן לשנות את -r ל -w כדי לבדוק אם קובץ יכול להיכתב במקום.
if [ -r $FILE ] 
then  
  # אם המפעיל מחזיר ערך true, הדפס הודעה כוללת
    # שהקובץ קיים וניתן לקריאה.
  echo "$FILE exists and is readable" 
else  
  # אם המפעיל מחזיר ערך false, הדפס הודעה כוללת
    # שהקובץ אינו קיים או שאין לקרוא אליו. 
  echo "$FILE does not exist or is unreadable"
fi

3. כעת, הפעל את הפקודה להרצת התסריט readable_file.sh.

bash readable_file.sh

הפעם, תראו הודעה שאומרת שהקובץ /root/test.txt אינו קיים או אינו קריא. מכיוון שהקובץ text.test ממוקם בתיקייה /root, אין למשתמש הנוכחי (ata) הרשאות קריאה לקובץ text.txt.

Executing the readable_file.sh script

4. לבסוף, הפעילו את הפקודות הבאות כדי לבצע את הפעולות הבאות:

  • שנו את קובץ ה-sudoers כך שהמשתמש הנוכחי (ata) יוכל להשתמש ב־sudo להרצת פקודות ברמה גבוהה.
  • הפעילו את סקריפט ה-readable_file.sh, שבודק האם קובץ מסוים ניתן לקריאה.
sudo bash
bash readable_file.sh

תראו למטה שהפלט מדפיס "test.txt קיים וניתן לקריאה", מכיוון שלמשתמש ata יש כעת הרשאת קריאה לקובץ test.txt.

Changing the sudoers file and executing the readable_file.sh script

מסקנה

A testing phase is always a priority before making drastic changes, whether on files or directories on your system. And in this tutorial, you’ve learned about the Bash file test operators and how to use them to test if a file (regular or special) or directory exists or if a file is readable or not.

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

למה לא לנסות לבדוק את סיומת של קובץ? או אולי לבדוק אם ישנם מספר קבצים כדי לראות האם כל הקבצים שאתה צריך זמינים?

Source:
https://adamtheautomator.com/bash-file-test/