Whatsup - לינוקס, תוכנה חופשית וקוד פתוח בעברית

שימוש מתקדם בלינוקס - הצגת כל התמונות מכל התיקיות אשר רשומות בקובץ

queency - 01/09/2018 - 16:09
נושא ההודעה: הצגת כל התמונות מכל התיקיות אשר רשומות בקובץ
שלום לכולם.

יש לי קובץ מלא ב PATH מסוימים (ה PATH הם לספריות שמכילים קבצי תמונה).
אני רוצה להציג את כל התמונות כאיקונים בNAUTILUS (עדיף) או בתוכנה אחרת PICASA לדוגמא


למישהו רעיון.
Anonymous - 01/09/2018 - 16:50
נושא ההודעה:
אתה יכול לנסות לכתוב סקריפט באש שיוצר symbolic link לכל אחד מהם בתיקייה ייעודית, ולהציג אותה...
Anonymous - 01/09/2018 - 17:43
נושא ההודעה:
Anonymous :
אתה יכול לנסות לכתוב סקריפט באש שיוצר symbolic link לכל אחד מהם בתיקייה ייעודית, ולהציג אותה...


רעיון טוב !
mksoft - 02/09/2018 - 14:08
נושא ההודעה:
אם יש לך יישום שיודע לקבל משורת הפקודה את שמות הקבצים או התיקיות, כמו eog של גנום לדוגמה, תוכל לעשות משהו כמו:
קוד:
cat images.txt | xargs eog

eog מציג גם את ה-thumbs.

זה הכי פשוט, ללא צורך בשינויים במערכת הקבצים (וקל יותר לטיפול כאשר הרשימה משתנה לדוגמא).

מגבלות אפשריות:
לא לעבור את מקסימום אורך שורת הפקודה (אפשר לבדוק עם getconf ARG_MAX).
רווחים בשמות הקבצים/תיקיות אשר בקובץ
queency - 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

Anonymous - 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

queency - 04/09/2018 - 08:53
נושא ההודעה:
עצה ובקשה

1) אל תתנו את הסקריפט הזה לנשים שקרובות אליכם תשתמשו בו לבד לשימושים שלכם.
2) עד שהגעתי אל הסקריפט הזה הספקתי לזהם את המערכת שלי ב 54000 לינקים שרק
אלוהים יודע איפה הם נמצאים .

אבל הטמטום היותר משמעותי הוא שגם ניסיתי למחוק אותם באמצעות סקריפט.

בקיצור FIREFOX התאושש לאחר התקנה מחדש ועוד כהנה וכהנה.
ו CHROMIUM לא ואני צריך אותו (משום מה אני לא יכול להעלות קבצים לשרת הדואר שלי
דרך FIREFOX )
מישהו יכול לתת רעיון

איך לפתור את זה (דפדפן חלופי תואם או דרך להתקין על מקום אחר)
Anonymous - 04/09/2018 - 14:12
נושא ההודעה:
רק אלוהים יודע איפה הם נמצאים? כולם נמצאים ישירות בתיקיה tmp . בהנחה שהיא באמת נוצרה בתחילתו, הרי שאפשר למוחקה כדי למחוק את כולם.

מה שכן, שם קובץ יכול לכלול רווחים ותווים מיוחדים אחרים. לכן:
קוד:

ln -s "$f" tmp/$i

ואם כבר, למקרה שיש קובץ בשם שמתחיל ב־'-':
קוד:

ln -s -- "$f" tmp/$i

queency - 04/09/2018 - 15:49
נושא ההודעה:
צפריר . אתה לא קורה בעיון ! אמרתי "עד שהגעתי " כלומר לפני הסקריפט
הזה היו עוד כמה טובים פחות Crying or Very sad

עמית : נקודות שבהחלט שוות מחשבה. יקח לי זמן לעכל את כולם.
Anonymous - 05/09/2018 - 08:37
נושא ההודעה:
רק עוד דבר קטן, שאולי קצת התייחסתי אליו. כמו שהסקריפט שלך כתוב הוא ייצור תיקייה בשם tmp במקום שאתה נמצא בו כאשר אתה מריץ את הסקריפט. אולי זה מה שאתה רוצה, אבל לי נראה עדיף שהלינקים ייוצרו במקום קבוע וידוע, כך תמיד גם תדע היכן הם. למשל, ליצור תייקייה קבועה בתיקיית הבית שלך, ובתוכה ליצור בכל הרצה תיקייה חדשה.

לצפריר - אתה בהחלט צודק לגבי הצורך לעטוף את המשתנים במרכאות. מה שכן, במקרה של locate השמות שמוחזרים הם full path ולכן לא נראה לי ששם כזה יכול להתחיל ב '-', למרות שבאופן כללי זו הערה נכונה.
queency - 06/09/2018 - 23:57
נושא ההודעה:
הייתי צריך לתקן את השורה :
1) אפוסטרוף לא במקום הנכון
2) סוגרים כפולים

done < <((locate -r '.*\.png$' -r '.*\.jpg$' -r '.*\.gif$' -l 1000 -e))

ולמה ה> > מופרד ?
Anonymous - 07/09/2018 - 09:09
נושא ההודעה:
queency :
הייתי צריך לתקן את השורה :
1) אפוסטרוף לא במקום הנכון
2) סוגרים כפולים

done < <((locate -r '.*\.png$' -r '.*\.jpg$' -r '.*\.gif$' -l 1000 -e))


כנראה טעויות שלי בהעתקה, טוב שמצאת

ציטוט:
ולמה ה> > מופרד ?


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

קוד:
<(command)


זה ה-process substitution, הוא "מחבר" את הפלט של הפקודה לשם קובץ (או file descriptor). הסימן שמופרד ממנו הוא redirection של הקובץ לתוך הלולאה.
Anonymous - 07/09/2018 - 10:51
נושא ההודעה:
queency :
הייתי צריך לתקן את השורה
2) סוגרים כפולים


רק אחר כך שמתי לב: למה אתה מתכוון בסוגריים כפולים? הסוגריים סביב לפקודה (מה שמתחיל ב-locate) צריכים להיות בודדים - כלומר סוגר אחד ימני ואחד שמאלי. אם הוספת עוד עטיפה של סוגריים, כנראה זה גורם לפקודה לרוץ ב-sub shell, זה אולי עובד אבל זה מיותר.
Anonymous - 07/09/2018 - 21:44
נושא ההודעה:
Anonymous :
queency :
הייתי צריך לתקן את השורה
2) סוגרים כפולים


רק אחר כך שמתי לב: למה אתה מתכוון בסוגריים כפולים? הסוגריים סביב לפקודה (מה שמתחיל ב-locate) צריכים להיות בודדים - כלומר סוגר אחד ימני ואחד שמאלי. אם הוספת עוד עטיפה של סוגריים, כנראה זה גורם לפקודה לרוץ ב-sub shell, זה אולי עובד אבל זה מיותר.


בדיוק . אני מדביק את זה ל shell קיים. ורואה אם עובד ורק אז שומר לקובץ.
Anonymous - 07/09/2018 - 22:53
נושא ההודעה:
לא ברור לי למה נדרש כאן process substitution.

הרי מורצת כאן פקודה והפלט שלה מתקבל ללולאה כקלט. כלומר: הלולאה מורצת בתת תהליך שהקלט שלו הוא שפלט של הפקודה האמורה.

וכן. הלולאה מורצת בתת תהליך. זה אומר שאם היא משנה ערך של משתנה, זה לא ישפיע מחוץ ללולאה.
queency - 07/09/2018 - 23:37
נושא ההודעה:
עמית: אל תשאל לאן שלחת אותי עם ה mktemp הזה שלך Very Happy

בקיצור: ניסיתי את הדוגמא של התקפת לינק על /etc/passwd שmktemp אמור
בעצם להגן עליו ובסיום ההליך הלך לי קובץ הסיסמאות .

כמובן שיש לי USBSTICK
אז שחזרתי אותו . אבל היה לי מאד לא נוח לאיזו דקה בערך. Very Happy

ולמדתי מה זה mktemp . שזה הכי חשוב . עכשיו אני סוף סוף הולך לגמור עם
התגובה שלך וללמוד את ה > > לעומק ואז בא לציון גואל.
Anonymous - 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.
Anonymous - 08/09/2018 - 11:43
נושא ההודעה:
queency :
עמית: אל תשאל לאן שלחת אותי עם ה mktemp הזה שלך Very Happy


זה דווקא מסקרן, אבל בסדר, לא אשאל.

ציטוט:

בקיצור: ניסיתי את הדוגמא של התקפת לינק על /etc/passwd שmktemp אמור
בעצם להגן עליו ובסיום ההליך הלך לי קובץ הסיסמאות .


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

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

למשל, במקום השורה

קוד:
ln -s $f tmp/$i


לכתוב משהו כמו

קוד:
echo 'ln -s' $f tmp/$i


להריץ, לבחון מה הפקודות שהיו אמורות להתבצע ולבדוק אם הן תקינות.
queency - 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



Anonymous - 08/09/2018 - 19:39
נושא ההודעה:
queency :

יש לי בעיה אחת . עדין לא הבנתי את ה "> >"


נניח שאני רוצה להציג את התוכן של קובץ, למשל .bashrc. אני יכול לעשות את זה כך

קוד:
cat ~/.bashrc


או כך

קוד:
cat < ~/.bashrc


בצורה קצת פשטנית, אפשר לומר שבצורה השנייה ה-shell פותח לקריאה את הקובץ ומחבר את הפלט ל-stdin של cat. זה מה שהאופרטור > עושה. אפשר לכתוב בעזרת האופרטור <, אולי זה יותר מוכר

קוד:
echo hello > my-file


ואפשר לקרוא בעזרת >.

זה בדיוק מה שקורה - תחשוב על

קוד:
<(command)


כעל קובץ שמכיל את הפלט ש-command מייצרת. זו המשמעות של הסינטקס הזה ב-bash. ואז משתמשים באופרטור > כדי לחבר את הפלט ל-stdin של הפקודה שקוראת אותו, הלולאה במקרה שלנו. (אם לא ברור, כל המבנה הזה, הסימן > יחד עם הסוגריים שהוא צריך להיות צמוד אליהם, והפקודה שבפנים, זו יחידה תחבירית אחת.)

וכמו שהצעתי, בקישור שנתתי תוכל אולי למצוא עוד פרטים.

רק מקריאה, הגירסה האחרונה של הסקריפט נראית בסדר גמור. הערה ממש קטנה, את השורה הראשונה התוך הלולאה, זו שמעלה ב-1 את i, תוכל לכתוב יותר פשוט:

קוד:
(( i++ ))


נפלאות bash Smile
queency - 09/09/2018 - 15:48
נושא ההודעה:
באנה עמית ה mktemp סידר אותי טוב.

יש לי סקריפט שאני מוריד מיוטיוב סרט כלשהו ומקודד אותו לפי צרכי השונים
mp4_2_mkv aac_2_mp3 webm_2_mp4 וכולי וכולי.

יש אפשרות כמובן להשתמש בparallel אבל עם ה mktemp אני פשוט יכול להפעיל
כמה shell שאני רוצה ואז אין התנגשויות !! +1 על הפקודה לעיל.

דרך אגב קיבלתי את ההמלצה שלך ל (( ++ )) ושיניתי את הסקריפט אצלי
כל הזמנים הם GMT + 2 שעות