לצמצם עם
עד כאן הכל נחמד, מה אם אני רוצה לחתוך שיר למשקל מוגדר מראש?
#truncate
#cat
#du
@bash_tips
truncate
רמת קושי: #beginners
פקודת truncate
מאפשרת לנו להגדיר משקל מוגדר לכל קובץ, אם לגומה יש לי לוג ששוקל 10MB ואני רוצה לשמור רק את 2 MB החדשים ביותר של הלוג$ du -h myapp.log
10M myapp.log
$ truncate --size=2M myapp.log
$ du -h myapp.log
2.0M myapp.log
בעצם מה שקרה הוא שכל החלק הישן יותר של הקובץ נזרק לפח ונשארתי רק עם הרשומות החדשות ביותר.עד כאן הכל נחמד, מה אם אני רוצה לחתוך שיר למשקל מוגדר מראש?
$ cat long_song.mp3 > shrink.mp3
$ du -h shrink.mp3
15M shrink.mp3
$ truncate --size=2M shrink.mp3
$ du -h shrink.mp3
2.0M shrink.mp3
#truncate
#cat
#du
@bash_tips
לפצל ולאחד קבצים עם
מכירים את זה שקבלתם לידכם התקן USB כדי להעביר אליו איזשהו קובץ גדול?
ואז בדיוק ברגע השיא כשפעולת העתקה כמעט מסתיימת אתם מגלים שמערכת הקבצים של הכונן היא FAT, ולכן העתקה נכשלת כי לא ניתן להעתיק קבצים מעל 4GB. לא כיף
פקודת
דגל
זה נראה כך.
חלוקה לפי מספר החלקים ולא לפי גודל הקובץ בעזרת דגל n-.
שימוש במספרים במקום באותיות בעזרת הדגל --numeric-suffixes.
פיצול קבצי טקסט לפי מספר השורות לקובץ (l-).
אוקי צלחנו את החלק של פיצול הקבצים אבל איך מאחדים אותם חזרה?
כפי שראינו בפוסטים הקודמים פקודת
נוכל לאמת את זה עם גיבוב של md5 לשני הקבצים
מהסיבה הזאת ניסיון לנגן קבצי מוסיקה ווידאו שפוצלו לא יצלח פרט לחלק הראשון שמכיל את המידע הדרוש לפיענוח, וגם אותו חלק יציג את האורך המלא של הקובץ כמו המקור אבל יעבוד תכלס רק עד החלק שפיצלנו.
#split
#cat
@bash_tips
split
ו cat
רמת קושי: #beginnersמכירים את זה שקבלתם לידכם התקן USB כדי להעביר אליו איזשהו קובץ גדול?
ואז בדיוק ברגע השיא כשפעולת העתקה כמעט מסתיימת אתם מגלים שמערכת הקבצים של הכונן היא FAT, ולכן העתקה נכשלת כי לא ניתן להעתיק קבצים מעל 4GB. לא כיף
פקודת
split
מאפשרת לפצל קבצים לאיזה גודל שתרצו, בעיקרון היא עובדת נפלא על קבצי טקסט, אבל היות והיא לא משנה את תוכן הקובץ היא עדין נהדרת כדי לפתור בעיות גם בסוגי קבצים אחרים, הם אומנם לא יהיו קריאים באותה העת אבל אחרי האיחוד הם יחזרו לכשהיו. $ split -b 2G my_file.mp4 my_file_part-
מה בעצם יש לנו כאן?דגל
b-
מאפשר לפצל לפי גודל (K/M/G), שם הקובץ עליו אני רוצה לפעול, ומהו השם התחלתי של הקבצים שיפוצלו. זה נראה כך.
$ ls
my_file.mp4
my_file_part-aa
my_file_part-ab
הפקודה ממספרת חלקים לפי אותיות, ברירת מחדל היא שני אותיות, דבר זה נתון לשינוי על ידי שימוש בדגל a-
ומספר שמייצג כמה אותיות יתווספו.$ split -b 2G my_file.mp4 my_file_part -a 1
$ ls
my_file.mp4
my_file_part-a
my_file_part-b
אפשרויות נוספות הןחלוקה לפי מספר החלקים ולא לפי גודל הקובץ בעזרת דגל n-.
שימוש במספרים במקום באותיות בעזרת הדגל --numeric-suffixes.
פיצול קבצי טקסט לפי מספר השורות לקובץ (l-).
אוקי צלחנו את החלק של פיצול הקבצים אבל איך מאחדים אותם חזרה?
כפי שראינו בפוסטים הקודמים פקודת
cat
יודעת לאחד קבצים על ידי שירשור, אפשרי להשתמש ב wildcard כדי לאסוף את כל הקבצים הרלוונטים ולאחד את כולם.$ cat my_file_part-* > my_new_file.mp4
$ ls
my_file.mp4
my_file_part-a
my_file_part-b
my_new_file.mp4
לא מאמינים שזה אותו הקובץ בדיוק בלי שום שינויים?נוכל לאמת את זה עם גיבוב של md5 לשני הקבצים
$ md5sum my_file.mp4
f86e0306d4c2a4fd3f18edd1a199a840 my_file.mp4
$ md5sum my_new_file.mp4
f86e0306d4c2a4fd3f18edd1a199a840 my_new_file.mp4
כמה הערות בקשר לפקודת split
הפקודה לא מעבדת את הפלט ולכן קבצים המכילים בכותרות הקובץ מידע על סוג הקובץ וערכים נוספים, מידע זה לא יועתק לקבצי הפיצול. מהסיבה הזאת ניסיון לנגן קבצי מוסיקה ווידאו שפוצלו לא יצלח פרט לחלק הראשון שמכיל את המידע הדרוש לפיענוח, וגם אותו חלק יציג את האורך המלא של הקובץ כמו המקור אבל יעבוד תכלס רק עד החלק שפיצלנו.
#split
#cat
@bash_tips
להעביר מספר שורות לקובץ (א)
רמת קושי: #advanced
לא מעט פעמים נרצה שהסקריפט שלנו יצור קובץ בעל תוכן מסויים, להלן מספר אפשרויות
שימוש ב Heredoc
פקודת cat וtee יודעות לקבל קלט וליצור ממנו קובץ, הסינטקס בנוי בצורה כזאת
בלוק שמתחיל באיזו מילה שתבחרו, במקרה שלנו EOL, ומופנה אל ה stdin של הפקודה בעזרת >>.
כל הטקסט שבתוך הבלוק יכתב אל הקובץ שעליו אנו מכריזים בשורה הראשונה.
זה נראה כך
בעוד שמדובר על צורה עבודה שנמצאת בשימוש מאוד נרחב, היא בעלת סינטקס לא ממש אינטואיטיבי אבל הבעיה הגדולה יותר זה שהיא רגישה לכך שהמילה שסוגרת את הבלוק תהיה בתחילת השורה, מספיק רווח אחד כדי להכשיל את הקוד.
פתרון
לאלו שרוצים להכניס את הקוד לעיל לפונקציה ולהזיח את הטסט כראוי, ניתן להשתמש בטאב במקום ברווח, בצורה זו שימוש ב heredoc יעבוד בלא בעיה (שימו לב שעורך הטקסט לא מחליף לכם טאבים ברווחים)
#cat
#heredoc
@bash_tips
רמת קושי: #advanced
לא מעט פעמים נרצה שהסקריפט שלנו יצור קובץ בעל תוכן מסויים, להלן מספר אפשרויות
שימוש ב Heredoc
פקודת cat וtee יודעות לקבל קלט וליצור ממנו קובץ, הסינטקס בנוי בצורה כזאת
בלוק שמתחיל באיזו מילה שתבחרו, במקרה שלנו EOL, ומופנה אל ה stdin של הפקודה בעזרת >>.
כל הטקסט שבתוך הבלוק יכתב אל הקובץ שעליו אנו מכריזים בשורה הראשונה.
זה נראה כך
$ cat << EOF > myfile.sql
first line
second line
EOF
למה לא נרצה לעבוד בשיטה זו?בעוד שמדובר על צורה עבודה שנמצאת בשימוש מאוד נרחב, היא בעלת סינטקס לא ממש אינטואיטיבי אבל הבעיה הגדולה יותר זה שהיא רגישה לכך שהמילה שסוגרת את הבלוק תהיה בתחילת השורה, מספיק רווח אחד כדי להכשיל את הקוד.
פתרון
לאלו שרוצים להכניס את הקוד לעיל לפונקציה ולהזיח את הטסט כראוי, ניתן להשתמש בטאב במקום ברווח, בצורה זו שימוש ב heredoc יעבוד בלא בעיה (שימו לב שעורך הטקסט לא מחליף לכם טאבים ברווחים)
#cat
#heredoc
@bash_tips