פורסם: 01/09/2018 - 16:09
נושא ההודעה: הצגת כל התמונות מכל התיקיות אשר רשומות בקובץ
|
שלום לכולם.
יש לי קובץ מלא ב PATH מסוימים (ה PATH הם לספריות שמכילים קבצי תמונה).
אני רוצה להציג את כל התמונות כאיקונים בNAUTILUS (עדיף) או בתוכנה אחרת PICASA לדוגמא
למישהו רעיון.
_________________ מערכת: GNU/Linux debian
|
|
חזרה לתוכן הדיון |
פורסם: 01/09/2018 - 16:50
נושא ההודעה:
|
אתה יכול לנסות לכתוב סקריפט באש שיוצר symbolic link לכל אחד מהם בתיקייה ייעודית, ולהציג אותה...
|
|
חזרה לתוכן הדיון |
פורסם: 01/09/2018 - 17:43
נושא ההודעה:
|
Anonymous : | אתה יכול לנסות לכתוב סקריפט באש שיוצר symbolic link לכל אחד מהם בתיקייה ייעודית, ולהציג אותה... |
רעיון טוב !
|
|
חזרה לתוכן הדיון |
פורסם: 02/09/2018 - 14:08
נושא ההודעה:
|
אם יש לך יישום שיודע לקבל משורת הפקודה את שמות הקבצים או התיקיות, כמו eog של גנום לדוגמה, תוכל לעשות משהו כמו:
קוד: | cat images.txt | xargs eog |
eog מציג גם את ה-thumbs.
זה הכי פשוט, ללא צורך בשינויים במערכת הקבצים (וקל יותר לטיפול כאשר הרשימה משתנה לדוגמא).
מגבלות אפשריות:
לא לעבור את מקסימום אורך שורת הפקודה (אפשר לבדוק עם getconf ARG_MAX).
רווחים בשמות הקבצים/תיקיות אשר בקובץ
|
|
חזרה לתוכן הדיון |
פורסם: 03/09/2018 - 22:53
נושא ההודעה:
|
למי שנמאס כמוני לחפש ICON לקיצורי דרך
קוד: |
#!/bin/sh
locate *png * jpg *gif > locate.txt # gather all png jpg gif full path in a file
grep '.png\|.gif\|.jpg' locate.txt > pics.txt #get only pics files
head -n 1000 pics.txt > limited.txt # limit to 1000 links
#create links
mkdir tmp
i=0
while read f; do
i=$(( $i + 1 ))
ln -s $f tmp/$i
done < limited.txt
nautilus tmp
|
_________________ מערכת: GNU/Linux debian
|
|
חזרה לתוכן הדיון |
פורסם: 04/09/2018 - 08:46
נושא ההודעה:
|
רעיון יפה, אבל כמה הצעות לשיפור
ל-locate יש אפשרויות שונות ואפשר להחליף את 3 הפקודות הראשונות בקריאה אחת ל-locate. שימוש בחיפוש regex יחסוך את הקריאה ל-grep, ושימוש באופציה -l מאפשר להגביל את מספר הרשומות שמוחזרות ויחסוך קריאה ל-head. למשל:
קוד: | locate -r '.*\.png$' -r '.*\.jpg$ -r '.*\.gif$' -l 1000 > locate.txt |
אולי תרצה להשתמש באופציה -e שבודקת שהקבצים אכן קיימים בזמן שהחיפוש מתבצע.
דבר נוסף, כדאי להגדיר את ה-full path של הקבצים הזמניים ואולי להשתמש ב-mktemp.
אם תשתמש ב-bash, אפשר להשתמש ב-process substitution כדי להפנות את הפלט של locate ישר ללולאה. זה חוסך את הקבצים הזמניים ונעשה בצורה אסינכרונית.
https://www.gnu.org/software/bash/manual/bash.html#Process-Substitution
בסופו של דבר, אפשר לעשות הכל בערך כך (עם bash):
קוד: |
#!/bin/bash
mkdir tmp
i=0
while read f; do
i=$(( $i + 1 ))
ln -s $f tmp/$i
done < <(locate -r '.*\.png$' -r '.*\.jpg$ -r '.*\.gif$' -l 1000 -e)
nautilus tmp
|
|
|
חזרה לתוכן הדיון |
פורסם: 04/09/2018 - 08:53
נושא ההודעה:
|
עצה ובקשה
1) אל תתנו את הסקריפט הזה לנשים שקרובות אליכם תשתמשו בו לבד לשימושים שלכם.
2) עד שהגעתי אל הסקריפט הזה הספקתי לזהם את המערכת שלי ב 54000 לינקים שרק
אלוהים יודע איפה הם נמצאים .
אבל הטמטום היותר משמעותי הוא שגם ניסיתי למחוק אותם באמצעות סקריפט.
בקיצור FIREFOX התאושש לאחר התקנה מחדש ועוד כהנה וכהנה.
ו CHROMIUM לא ואני צריך אותו (משום מה אני לא יכול להעלות קבצים לשרת הדואר שלי
דרך FIREFOX )
מישהו יכול לתת רעיון
איך לפתור את זה (דפדפן חלופי תואם או דרך להתקין על מקום אחר)
_________________ מערכת: GNU/Linux debian
|
|
חזרה לתוכן הדיון |
פורסם: 04/09/2018 - 14:12
נושא ההודעה:
|
רק אלוהים יודע איפה הם נמצאים? כולם נמצאים ישירות בתיקיה tmp . בהנחה שהיא באמת נוצרה בתחילתו, הרי שאפשר למוחקה כדי למחוק את כולם.
מה שכן, שם קובץ יכול לכלול רווחים ותווים מיוחדים אחרים. לכן:
ואם כבר, למקרה שיש קובץ בשם שמתחיל ב־'-':
קוד: |
ln -s -- "$f" tmp/$i
|
|
|
חזרה לתוכן הדיון |
פורסם: 04/09/2018 - 15:49
נושא ההודעה:
|
צפריר . אתה לא קורה בעיון ! אמרתי "עד שהגעתי " כלומר לפני הסקריפט
הזה היו עוד כמה טובים פחות
עמית : נקודות שבהחלט שוות מחשבה. יקח לי זמן לעכל את כולם.
_________________ מערכת: GNU/Linux debian
|
|
חזרה לתוכן הדיון |
פורסם: 05/09/2018 - 08:37
נושא ההודעה:
|
רק עוד דבר קטן, שאולי קצת התייחסתי אליו. כמו שהסקריפט שלך כתוב הוא ייצור תיקייה בשם tmp במקום שאתה נמצא בו כאשר אתה מריץ את הסקריפט. אולי זה מה שאתה רוצה, אבל לי נראה עדיף שהלינקים ייוצרו במקום קבוע וידוע, כך תמיד גם תדע היכן הם. למשל, ליצור תייקייה קבועה בתיקיית הבית שלך, ובתוכה ליצור בכל הרצה תיקייה חדשה.
לצפריר - אתה בהחלט צודק לגבי הצורך לעטוף את המשתנים במרכאות. מה שכן, במקרה של locate השמות שמוחזרים הם full path ולכן לא נראה לי ששם כזה יכול להתחיל ב '-', למרות שבאופן כללי זו הערה נכונה.
|
|
חזרה לתוכן הדיון |
פורסם: 06/09/2018 - 23:57
נושא ההודעה:
|
הייתי צריך לתקן את השורה :
1) אפוסטרוף לא במקום הנכון
2) סוגרים כפולים
done < <((locate -r '.*\.png$' -r '.*\.jpg$' -r '.*\.gif$' -l 1000 -e))
ולמה ה> > מופרד ?
_________________ מערכת: GNU/Linux debian
|
|
חזרה לתוכן הדיון |
פורסם: 07/09/2018 - 09:09
נושא ההודעה:
|
queency : | הייתי צריך לתקן את השורה :
1) אפוסטרוף לא במקום הנכון
2) סוגרים כפולים
done < <((locate -r '.*\.png$' -r '.*\.jpg$' -r '.*\.gif$' -l 1000 -e))
|
כנראה טעויות שלי בהעתקה, טוב שמצאת
הסתכל בקישור שנתתי למעלה. אלה שני ביטויים והם צריכים להיות מופרדים. הראשון
זה ה-process substitution, הוא "מחבר" את הפלט של הפקודה לשם קובץ (או file descriptor). הסימן שמופרד ממנו הוא redirection של הקובץ לתוך הלולאה.
|
|
חזרה לתוכן הדיון |
פורסם: 07/09/2018 - 10:51
נושא ההודעה:
|
queency : | הייתי צריך לתקן את השורה
2) סוגרים כפולים
|
רק אחר כך שמתי לב: למה אתה מתכוון בסוגריים כפולים? הסוגריים סביב לפקודה (מה שמתחיל ב-locate) צריכים להיות בודדים - כלומר סוגר אחד ימני ואחד שמאלי. אם הוספת עוד עטיפה של סוגריים, כנראה זה גורם לפקודה לרוץ ב-sub shell, זה אולי עובד אבל זה מיותר.
|
|
חזרה לתוכן הדיון |
פורסם: 07/09/2018 - 21:44
נושא ההודעה:
|
Anonymous : | queency : | הייתי צריך לתקן את השורה
2) סוגרים כפולים
|
רק אחר כך שמתי לב: למה אתה מתכוון בסוגריים כפולים? הסוגריים סביב לפקודה (מה שמתחיל ב-locate) צריכים להיות בודדים - כלומר סוגר אחד ימני ואחד שמאלי. אם הוספת עוד עטיפה של סוגריים, כנראה זה גורם לפקודה לרוץ ב-sub shell, זה אולי עובד אבל זה מיותר. |
בדיוק . אני מדביק את זה ל shell קיים. ורואה אם עובד ורק אז שומר לקובץ.
|
|
חזרה לתוכן הדיון |
פורסם: 07/09/2018 - 22:53
נושא ההודעה:
|
לא ברור לי למה נדרש כאן process substitution.
הרי מורצת כאן פקודה והפלט שלה מתקבל ללולאה כקלט. כלומר: הלולאה מורצת בתת תהליך שהקלט שלו הוא שפלט של הפקודה האמורה.
וכן. הלולאה מורצת בתת תהליך. זה אומר שאם היא משנה ערך של משתנה, זה לא ישפיע מחוץ ללולאה.
|
|
חזרה לתוכן הדיון |
פורסם: 07/09/2018 - 23:37
נושא ההודעה:
|
עמית: אל תשאל לאן שלחת אותי עם ה mktemp הזה שלך
בקיצור: ניסיתי את הדוגמא של התקפת לינק על /etc/passwd שmktemp אמור
בעצם להגן עליו ובסיום ההליך הלך לי קובץ הסיסמאות .
כמובן שיש לי USBSTICK
אז שחזרתי אותו . אבל היה לי מאד לא נוח לאיזו דקה בערך.
ולמדתי מה זה mktemp . שזה הכי חשוב . עכשיו אני סוף סוף הולך לגמור עם
התגובה שלך וללמוד את ה > > לעומק ואז בא לציון גואל.
_________________ מערכת: GNU/Linux debian
|
|
חזרה לתוכן הדיון |
פורסם: 08/09/2018 - 11:28
נושא ההודעה:
|
צפריר : | לא ברור לי למה נדרש כאן process substitution. |
זה לא "נדרש" - יש דרכים שונות להעביר פלט של פקודה אחת לקלט של פקודה אחרת (הלולאה במקרה שלפנינו), ו-process substitution הוא אחת מהן. אפשרות נוספת היא להשתמש ב-pipe, ואפשר להשתמש גם ב-command substitution. יש גם את הדרך בסקריפט המקורי של queency, קרי לכתוב את הפלט של הפקודה הראשונה לקובץ, ולקרוא אותו על ידי הפקודה השנייה.
היתרון בשתי הדרכים הראשונות (command substitution ו-pipe) היא שהיצירה של הפלט (על ידי הפקודה הראשונה) וקריאתו (על ידי הפקודה השנייה) נעשות בצורה אסינכרונית. למשל, הלולאה תקרא ותעבד שורה מהפלט של locate ברגע שהשורה זמינה.
בשתי הדרכים האחרונות שציינתי הקריאה של פלט הפקודה הראשונה תעשה רק לאחר שהוא יהיה כולו מוכן. יש לזה שני חסרונות עיקריים: ראשית, כמו שציינתי, צריך להמתין עד שכל הפלט מוכן ורק אז להתחיל לעבד אותו. זה איטי יותר (במקום לעשות דברים במקביל הם נעשים "בטור") ובנוסף, אם הסקריפט אמור להיות אינטראקטיבי, יש פגיעה ב"חווית המשתמש" - צריך לבהות במסך עד שהפקודה הראשונה תסתיים. שנית, אם הפקודה הראשונה מבצעת משהו שמשתמש בהרבה זיכרון - למשל, קוראת קובץ שלם ומכינה ממנו פלט - כל הפלט של הפקודה הראשונה יישמר בזיכרון ורק אז יעובד על ידי הפקודה השנייה. זה מגדיל את השימוש בזיכרון. אם עובדים אסינכרונית, צריך לשמור בזיכרון רק את הנתונים הזמניים - למשל את השורה שעובדים עליה.
שימוש ב-pipe דומה (מבחינת התהליך שקורה) לשימוש ב-process substitution, אבל באפשרות השנייה יש במקרים מסויימים יותר גמישות או מרחב אפשרויות יותר גדול - למשל, אפשר להעביר יותר מפלט אחד לפקודה. הנה דוגמה קצרה, בלי להרחיב:
קוד: | sort <(echo hello) <(echo world) |
או שאולי לא הבנתי את ההערה שלך?
בכל אופן, הנה סקריפט קצר שמדגים את האפשרויות השונות (פרט לכתיבה לקובץ וקריאה ממנו).
קוד: |
#!/bin/bash
my_cmd()
{
for i in $(seq 10); do
echo $i
sleep 1
done
}
echo 'process substitution (asynchronous):'
while read line; do
echo 'line:' $line
done < <(my_cmd)
echo 'using pipe (asynchronous too):'
my_cmd | while read line; do
echo 'line:' $line
done
echo 'command substitution (synchronous):'
for line in $(my_cmd); do
echo 'line:' $line
done
|
ציטוט: | הרי מורצת כאן פקודה והפלט שלה מתקבל ללולאה כקלט. כלומר: הלולאה מורצת בתת תהליך שהקלט שלו הוא שפלט של הפקודה האמורה.
וכן. הלולאה מורצת בתת תהליך. זה אומר שאם היא משנה ערך של משתנה, זה לא ישפיע מחוץ ללולאה. |
בדוגמאות שנתתי, וגם בסקריפט המקורי, הלולאה לא מתבצעת ב-subshell אלא ב-shell הראשי (זה שבו רץ הסקריפט). מכאן גם נובע ששינוי של משתנה בתוך הלולאה יראה גם מחוץ לה.
מה שרץ ב-subshell זו הפקודה שהפלט שלה מועבר ב-pipe או באמצעות process substituiton.
|
|
חזרה לתוכן הדיון |
פורסם: 08/09/2018 - 11:43
נושא ההודעה:
|
queency : | עמית: אל תשאל לאן שלחת אותי עם ה mktemp הזה שלך |
זה דווקא מסקרן, אבל בסדר, לא אשאל.
ציטוט: |
בקיצור: ניסיתי את הדוגמא של התקפת לינק על /etc/passwd שmktemp אמור
בעצם להגן עליו ובסיום ההליך הלך לי קובץ הסיסמאות .
|
אולי לא ירדתי לסוף דעתך, ואני לא מכיר את הדוגמה שציינת, אבל האם ניסית משהו ובחרת לנסות דווקא על קובץ ה-passwd? אם כן, מדוע? אם מנסים ללמוד פקודה חדשה, או בוחנים סקריפט שכותבים, תמיד כדאי לעשות את זה בסביבה מבודדת כך ששום דבר במערכת ה"אמתית" לא יוכל להיפגע.
באופן דומה, הייתי גם דואג שהסקריפט, בזמן הבדיקות והכתיבה שלו, לא יוכל להזיק - דרך אחת שאפשר להשתמש בה היא להחליף פקודות שעושות משהו (כמו יצירה של לינק) בפקודת echo שרק מראה מה הפקודה שהייתה רצה (אחרי כל הרחבות המשתנים ודברים דומים). זה מה שאני בדרך כלל עושה. כך אולי היו נחסכות הבעיות שאמרת שקרו במהלך הנסיונות הראשוניים שלך.
למשל, במקום השורה
לכתוב משהו כמו
קוד: | echo 'ln -s' $f tmp/$i |
להריץ, לבחון מה הפקודות שהיו אמורות להתבצע ולבדוק אם הן תקינות.
|
|
חזרה לתוכן הדיון |
פורסם: 08/09/2018 - 17:46
נושא ההודעה:
|
זו הגרסה הכי נכונה לביצוע
יש לי בעיה אחת . עדין לא הבנתי את ה "> >"
זה יותר נעים לעין מ הגרסה האסינכרונית השנייה שהצגת
אבל פחות ברור בביצוע.
קוד: |
#!/bin/bash
tmpdir=`mktemp -d /run/shm/tmpXXX`
i=0
while read f; do
i=$(( $i + 1 ))
ln -s $f $tmpdir/$i
done < <((locate -r '.*\.png$' -r '.*\.jpg$' -r '.*\.gif$' -l 1000 -e))
nautilus $tmpdir
|
_________________ מערכת: GNU/Linux debian
|
|
חזרה לתוכן הדיון |
פורסם: 08/09/2018 - 19:39
נושא ההודעה:
|
queency : |
יש לי בעיה אחת . עדין לא הבנתי את ה "> >"
|
נניח שאני רוצה להציג את התוכן של קובץ, למשל .bashrc. אני יכול לעשות את זה כך
או כך
בצורה קצת פשטנית, אפשר לומר שבצורה השנייה ה-shell פותח לקריאה את הקובץ ומחבר את הפלט ל-stdin של cat. זה מה שהאופרטור > עושה. אפשר לכתוב בעזרת האופרטור <, אולי זה יותר מוכר
ואפשר לקרוא בעזרת >.
זה בדיוק מה שקורה - תחשוב על
כעל קובץ שמכיל את הפלט ש-command מייצרת. זו המשמעות של הסינטקס הזה ב-bash. ואז משתמשים באופרטור > כדי לחבר את הפלט ל-stdin של הפקודה שקוראת אותו, הלולאה במקרה שלנו. (אם לא ברור, כל המבנה הזה, הסימן > יחד עם הסוגריים שהוא צריך להיות צמוד אליהם, והפקודה שבפנים, זו יחידה תחבירית אחת.)
וכמו שהצעתי, בקישור שנתתי תוכל אולי למצוא עוד פרטים.
רק מקריאה, הגירסה האחרונה של הסקריפט נראית בסדר גמור. הערה ממש קטנה, את השורה הראשונה התוך הלולאה, זו שמעלה ב-1 את i, תוכל לכתוב יותר פשוט:
נפלאות bash
|
|
חזרה לתוכן הדיון |
פורסם: 09/09/2018 - 15:48
נושא ההודעה:
|
באנה עמית ה mktemp סידר אותי טוב.
יש לי סקריפט שאני מוריד מיוטיוב סרט כלשהו ומקודד אותו לפי צרכי השונים
mp4_2_mkv aac_2_mp3 webm_2_mp4 וכולי וכולי.
יש אפשרות כמובן להשתמש בparallel אבל עם ה mktemp אני פשוט יכול להפעיל
כמה shell שאני רוצה ואז אין התנגשויות !! +1 על הפקודה לעיל.
דרך אגב קיבלתי את ההמלצה שלך ל (( ++ )) ושיניתי את הסקריפט אצלי
_________________ מערכת: GNU/Linux debian
|
|
חזרה לתוכן הדיון |
|