Bash Tips
נענים לאתגר רמת קושי: #advanced האתגר הבא מבוסס על סיפור אמיתי, כמו רוב הטיפים בערוץ 😊. קובץ זיפ הבא מכיל רשימת קבצי דמה PDF של אקורדים לגיטרה בשמות עבריים, שמות הקבצים מורכבים משם הזמר ושם השיר (לרוב), חלק משמות הקבצים הן עם רווח והאחרים עם . או עם _ כמפריד…
פתרון האתגר סדר בחדר
משימה שניה
רמת קושי: #beginners
החלק השני של המשימה הוא
להצליח להתגבר על קבצים ששם הזמר נמצא בסוף שם הקובץ.
לכאורה כשחושבים על המשימה הזאת בפעם הראשונה לא מבינים איך זה אפשרי לביצוע בלא שיהיה רשימה של הזמרים לעבור עליה ולחפש מחרוזות. לאחר שמסיימים את האתגר הראשון מבינים שבעצם יש לנו רשימה של זמרים, הלא היא רשימת התיקיות שיצרנו במשימה הראשונה שבעצם נתנה לנו רשימה נכבדה של זמרים.
מה יהיה אם פשוט נעבור על שמות התיקיות שיצרנו ונחפש את המחרוזות שלהם בכל הקבצים? בצורה הזאת לא משנה היכן יהיה קיים שם הזמר, אם לפני כן היה קובץ אחד ששם הזמר היה בתחילתו, נוכל לאתר את כל הקבצים ששם הזמר נמצא בסופם.
הקוד שמריץ את התהליך הזה פשוט אף הוא והוא נראה כך
שורה 7: אוספת את כל שמות התיקיות שנמצא תחת תיקיית העבודה שיצרנו (test)
ובעצם יוצא שכך נראה כרגע התוכן של משתנה
1. לוקחת את שם הזמר בדוגמה שלנו הוא
הנתיבים שאנו מקבלים נראים כך
2. שמות הקבצים שיצאו תואמים לשם התיקייה של הזמר מועברים לאותה תיקייה.
זה גורם לכך שכל תיקיית זמר מאורגנת מחדש ומקבלת קבצים חדשים, ולכך שיש כרגע תיקיות ריקות בעץ הקבצים שלנו לאחר ששלפנו משם את הקבצים שהיו תואמים את החיפוש.
שורה 12: הפקודה האחרונה בסופו של דבר עוברת על כל התיקיות הריקות ומוחקת אותם.
זהו עד כאן משימה שניה של האתגר
התיקיות לא מסודרות עדין 100% כי יש זמרים ששמם מופיע בסוף הקובץ מבלי שיהיו להם קבצים ששם הזמר מופיע בתחילתם, עוד קבצים אחרים שאינם נושאים שם זמר וכו' אבל 95% עבודה נעשתה, כנראה שזהו שלב 20/80 במצב שלנו.
#challenge
#find
#loop
#rmdir
@bash_tips
משימה שניה
רמת קושי: #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