Bash Tips
נענים לאתגר רמת קושי: #advanced האתגר הבא מבוסס על סיפור אמיתי, כמו רוב הטיפים בערוץ 😊. קובץ זיפ הבא מכיל רשימת קבצי דמה PDF של אקורדים לגיטרה בשמות עבריים, שמות הקבצים מורכבים משם הזמר ושם השיר (לרוב), חלק משמות הקבצים הן עם רווח והאחרים עם . או עם _ כמפריד…
פתרון האתגר סדר בחדר
רמת קושי: #beginners
משימה ראשונה
בואו נציץ לרגע במשימה הראשונה של האתגר ונראה מהי.
לבנות את עץ התיקיות על סמך זה ששם הזמר הוא בתחילת שם הקובץ,
שירים שאין להם שם זמר יכנסו לתיקיה בעלת שם השיר, או קומבינציה מוזרה אחרת.
האתגר הראשון בו אנו נתקלים כשאנו נגשים לאתגר הוא חוסר סטנדרטיזציה בשמות הקבצים, אם נעיף רגע מבט על כל הקבצים נשים לב שרוב הקבצים מסודרים כך ששם הזמר מופיע בתחילת שם הקובץ, אם כן בשביל להשיג סדר ראשוני בקבצים נוכל לארגן חלק ניכר מהקבצים על ידי שליפת 2 המילים הראשונות של שם הקובץ וליצור ממנו תיקייה.
וזה בדיוק מה שעושה הקוד הבא
שורה 3 ו 4: מעבירה את שם הקובץ את התהליך הבא שמורכב מ3 חלקים
1. מעבירה את שם הקובץ הבא לפקודת
2. פקודת
שלב א' היא מסירה את כל התווים המיוחדים והרווחים שמופיעים בתווים הראשונים של הקובץ .
שלב ב' היא מחליפה את תווי
מה שמביא אותנו למצב ששם הקובץ כרגע הוא כך
פקודת
ואז אנו מעבירים טווח של מילים אותם אנו רוצים לשלוף, 1-2 אלו שני המילים הראשונות.
אז כרגע בסופו של תהליך שורה 3 נראית כך
שורה 5: יוצרת תיקיית על שם הזמר.
שורה 6: מעתיקה את השיר לתיקייה שכרגע נוצרה.
התוצאה היא רשימת תיקיות שמכילות את שני המילים הראשונות של הקבצים.
קבצים שיש להם את אותם 2 מילים בראש הקובץ מקובצים תחת אותה תיקייה.
עד כאן חלק א' של האתגר
יש לכם רעיונות לשיפור, הערות, טיפים? מוזמנים לשתף בתגובות
בימים הקרובים אפרסם פתרון גם למשימה השניה, עד אז מי שרוצה לאתגר את עצמו מוזמן
#challenge
#loops
#sed
#cut
@bash_tips
רמת קושי: #beginners
משימה ראשונה
בואו נציץ לרגע במשימה הראשונה של האתגר ונראה מהי.
לבנות את עץ התיקיות על סמך זה ששם הזמר הוא בתחילת שם הקובץ,
שירים שאין להם שם זמר יכנסו לתיקיה בעלת שם השיר, או קומבינציה מוזרה אחרת.
האתגר הראשון בו אנו נתקלים כשאנו נגשים לאתגר הוא חוסר סטנדרטיזציה בשמות הקבצים, אם נעיף רגע מבט על כל הקבצים נשים לב שרוב הקבצים מסודרים כך ששם הזמר מופיע בתחילת שם הקובץ, אם כן בשביל להשיג סדר ראשוני בקבצים נוכל לארגן חלק ניכר מהקבצים על ידי שליפת 2 המילים הראשונות של שם הקובץ וליצור ממנו תיקייה.
וזה בדיוק מה שעושה הקוד הבא
1 for file in *;
2 do
3 sed_expr='s/^[[:punct:][:space:]]//g ; s/[_,-]/ /g'
4 dest="test/$(echo "${file}" | sed "$sed_expr" | cut -f 1-2 -d ' ' )"
5 mkdir -p "$dest"
6 cp "$file" "$dest"
7 done
שורה 1: אוספת את כל הקבצים שבתיקייה ומעבירה קובץ קובץ לעיבוד.שורה 3 ו 4: מעבירה את שם הקובץ את התהליך הבא שמורכב מ3 חלקים
1. מעבירה את שם הקובץ הבא לפקודת
sed
שמחה_פרידמן_עוד_יבוא_היום_אקורדים_קלים.pdf
2. פקודת
sed
מריצה שני עיבודים כדי ליצור סטנדרט בין כל הקבצים (;
הוא חוצץ בין שני הביטויים)שלב א' היא מסירה את כל התווים המיוחדים והרווחים שמופיעים בתווים הראשונים של הקובץ .
שלב ב' היא מחליפה את תווי
_ , -
ברווח.מה שמביא אותנו למצב ששם הקובץ כרגע הוא כך
שמחה פרידמן עוד יבוא היום אקורדים קלים.pdf
3. בחירה של 2 המילים הראשונות, איך זה קורה? פקודת
cut
מקבלת פרמטר לפיו היא מפצלת מילים על פי רווח, ואז אנו מעבירים טווח של מילים אותם אנו רוצים לשלוף, 1-2 אלו שני המילים הראשונות.
אז כרגע בסופו של תהליך שורה 3 נראית כך
dest="test/שמחה פרידמן"
מפה זה די פשוט וקלשורה 5: יוצרת תיקיית על שם הזמר.
שורה 6: מעתיקה את השיר לתיקייה שכרגע נוצרה.
התוצאה היא רשימת תיקיות שמכילות את שני המילים הראשונות של הקבצים.
קבצים שיש להם את אותם 2 מילים בראש הקובץ מקובצים תחת אותה תיקייה.
עד כאן חלק א' של האתגר
יש לכם רעיונות לשיפור, הערות, טיפים? מוזמנים לשתף בתגובות
בימים הקרובים אפרסם פתרון גם למשימה השניה, עד אז מי שרוצה לאתגר את עצמו מוזמן
#challenge
#loops
#sed
#cut
@bash_tips
יציאה מלולאה מקוננת
רמת קושי: #beginners
בבאש כמו בכל שפת תכנות בשביל להפסיק ריצה של לולאה משתמשים בב break
לשם כך באש מאפשרת להעביר פרמטר ל break כדי להגדיר עד איזה עומק השבירה של הלולאה תתבצע, בדוגמה הבאה בשבירה תתבצע על שתי הלולאות.
@bash_tips
רמת קושי: #beginners
בבאש כמו בכל שפת תכנות בשביל להפסיק ריצה של לולאה משתמשים בב break
,
for i in {1..10}
do
echo $i
sleep 1
breakמה עושים כשהלולאה רצה בתוך לולאה אחרת (לולאה מקוננת) ורוצים לצאת משתי הלולאות?
done
לשם כך באש מאפשרת להעביר פרמטר ל break כדי להגדיר עד איזה עומק השבירה של הלולאה תתבצע, בדוגמה הבאה בשבירה תתבצע על שתי הלולאות.
for i in {1..10}
do
for j in {1..10}
do
echo $i
sleep 1
break 2
done
echo first loop
done
#loops@bash_tips