או Bash

12/10/2018

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

1. המשימה

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

2. שורה וחצי Bash להצלה

אז מסתבר שיש לנו כבר על המחשב את כל הכלים שצריך בשביל לפתור את הבעיה:

  1. הפקודה comm יודעת לקחת שתי רשימות ולהראות רק את הדברים שמופיעים באחת בלבד, בשניה בלבד או בשתיהן.

  2. הפקודה ls תציג את רשימת כל הקבצים בתיקיה.

  3. הפקודה cat תציג את רשימת כל שמות הקבצים בקובץ הרשימה.

  4. הפקודה sort תסדר את שתי הרשימות כי comm אוהבת לעבוד על קלט ממוין.

סך הכל כשמחברים הכל ביחד מקבלים:

comm -3 <(ls -1 | sort) <(cat ../list.txt | sort) | xargs rm

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

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

https://www.tocode.co.il/bundles/unix1