מדריך זריז לפקודה find ביוניקס

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

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

1. המנגנון של find

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

הפרמטר הראשון ל find והיחיד שחייבים להעביר הוא תיקיית התחלת החיפוש. נראה הפעלה פשוטה של הפקודה:

$ find .
.
./Doc
./Doc/README.txt
./Doc/test.c
./img
./include
./include/player.h
./lib
./lib/zlib.c
./newdir
./src
./src/main.c
./src/player.c
./test.pl

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

2. חיפוש לפי סוג

עד כאן התוצאה דומה ל ls או tree. הגדולה של find היא בסינון, כך למשל בהוספת המתג type נוכל לקבל רק את התיקיות או הקבצים:

$ find . -type d
.
./Doc
./img
./include
./lib
./newdir
./src

$ find . -type f
./Doc/README.txt
./Doc/test.c
./include/player.h
./lib/zlib.c
./src/main.c
./src/player.c
./test.pl

הפרמטרים של find אחרי תיקיית החיפוש נקראים קריטריונים. הקריטריון type מסנן תוצאות לפי סוג הדבר שמצאנו והערכים האפשריים ל type כוללים את f עבור קובץ, d עבור תיקיה ו l עבור קישור סימבולי.

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

$ man find

3. חיפוש לפי שם

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

# search for file named main.c
$ find . -name main.c

# search for files ending with .o
$ find . -name "*.o"

# find all directories named src
$ find . -type d -name src

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

4. חיפוש לפי גודל

בחיפוש לפי גודל הקובץ נרצה לציין טווחים ולא מספר מדויק. הסימנים + ו -מציינים גדול מ... או קטן מ... בהתאמה. להלן מספר דוגמאות להמחשה:

# find all files larger than 2k
$ find . -size +2k

# find all files smaller than 2mb
$ find . -size -2M

# find all files larger than 2k but smaller than 5k
$ find . -size +2k -size -5k

5. הפעלת פקודה על תוצאות החיפוש

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

# Print all subdirectories and how much space each one takes
$ find . -type d -exec du -sh {} \;
112K    .
  0B    ./Doc
104K    ./img
  0B    ./include
4.0K    ./lib
4.0K    ./lib/game
  0B    ./newdir
  0B    ./src

הפקודה du -sh מקבלת שם של תיקיה ומציגה כמה מקום התיקיה תופסת על הדיסק. לדוגמא אפשר להפעיל את הפקודה באופן הבא:

$ du -sh /etc
16M /etc

בדוגמת ה find ביקשתי מ find להפעיל את הפקודה du -sh על כל תוצאה שמתקבלת, כלומר על כל אחת מהתיקיות ברשימת תוצאות החיפוש. הסימן המיוחד {} הוחלף בשם התיקיה וכך קיבלנו רשימה של כל התיקיות והגדלים שלהן.

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

$ find . -type f -name "*.txt" -exec cp {} "{}".old \;

6. מתגים נוספים

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

$ find . -maxdepth 1 -type f

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

$ find -L /etc -type f -size +1M
/etc/cups/ppd/Canon_MG2900_series.ppd
/etc/cups/ppd/Canon_MG2900_series.ppd.O