Bash Tips
985 subscribers
14 photos
4 files
45 links
רוצים להשתמש בלינוקס אבל לא ממש מכירים את הכלים שהיא מספקת לעבודה?

בערוץ הבא תמצאו אוסף טיפים שימושיים ב-Bash והכרות עם כלים שונים שעשויים לחסוך מאמץ ועבודה בכתיבת סקריפטים ומימוש אוטומציות.
Download Telegram
Bash Tips
נענים לאתגר רמת קושי: #advanced האתגר הבא מבוסס על סיפור אמיתי, כמו רוב הטיפים בערוץ 😊. קובץ זיפ הבא מכיל רשימת קבצי דמה PDF של אקורדים לגיטרה בשמות עבריים, שמות הקבצים מורכבים משם הזמר ושם השיר (לרוב), חלק משמות הקבצים הן עם רווח והאחרים עם . או עם _ כמפריד…
פתרון האתגר סדר בחדר
משימה שניה
רמת קושי: #beginners

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

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

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

הקוד שמריץ את התהליך הזה פשוט אף הוא והוא נראה כך

7 for dir in test/*;
8 do
9 dirname="${dir/ /*}"
10 find test/* -type f -path "*${dirname##*/}*" -exec mv {} "$dir" \;
11 done
12 rmdir test/*

אחרי שהסברנו מה הרעיון שהקוד בא לממש, נעבר לראות איך זה קורה בפועל
שורה 7: אוספת את כל שמות התיקיות שנמצא תחת תיקיית העבודה שיצרנו (test)

test/שמחה פרידמן

שורה 9: מחליפה את הרווח בכוכבית, למה אתם שואלים? כי regex זה חשוב.
ובעצם יוצא שכך נראה כרגע התוכן של משתנה dirname
test/שמחה*פרידמן

שורה 10: מבצעת 2 פעולות
1. לוקחת את שם הזמר בדוגמה שלנו הוא שמחה*פרידמן ומחפשת קבצים שנושאים את שם שלו תחת הנתיב test
הנתיבים שאנו מקבלים נראים כך

test/שמחה פרידמן/שמחה_פרידמן_עוד_יבוא_היום_אקורדים_קלים.pdf

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

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

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


זהו עד כאן משימה שניה של האתגר

התיקיות לא מסודרות עדין 100% כי יש זמרים ששמם מופיע בסוף הקובץ מבלי שיהיו להם קבצים ששם הזמר מופיע בתחילתם, עוד קבצים אחרים שאינם נושאים שם זמר וכו' אבל 95% עבודה נעשתה, כנראה שזהו שלב 20/80 במצב שלנו.
#challenge
#find
#loop
#rmdir

@bash_tips