כיצד להשתמש בפקודות שעובדות רק עם קובץ אחד בכל פעם עם כל הקבצים שתבחר

פעמים רבות אנו צריכים להריץ סקריפט כדי להמיר קובץ PDF לטקסט, להמיר את קבצי ה- doc ל- HTML וכו '. העניין הוא שפקודות אלה מקבלות רק קובץ אחד בכל פעם וזה מאוד מייגע עבורנו אם עלינו לבצע את אותה משימה בכמה קבצים, במיוחד כאשר אנו מבצעים סקריפט.

אני מציע פתרון לבעיה זו באמצעות ls, צמא, grep, awk y sh. מה שנעשה הוא ליצור את שורת הפקודה הנכונה בכל שורה ולבצע אותם עם sh, ומכיוון ש- יבצע שורה אחת בכל פעם, צריכת זיכרון ה- RAM לא תגדל, מה שבשיטות אחרות אפילו יכול להקפיא מכונות נמוכות.

בואו נראה כיצד לבצע את רצף הפקודה הזה.

1- הדבר הראשון שעלינו לעשות הוא להציג את הקבצים שישמשו דרכם ls:

ls --directory /camino/a/carpeta/*.ext

2- אז נצטרך קבצים אלה להעביר הצעות מחיר «/ דרך / לקבוצה של
קבצים«

ls --directory /camino/a/carpeta/*.ext | sed 's/^/"/' | sed 's/$/"/'

3- עכשיו awk הוא יהיה מוכן לקבל את הנתונים.

ls --directory /camino/a/carpeta/*.ext | sed 's/^/"/' | sed 's/$/"/' | awk '{print $0}'

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

\”

הראה קו נטוי אחורי בפלט (נצטרך להקליד שלוש פסים)

\\\

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

'""'\"\'""'

4- בואו נראה כיצד לשנות את שם כל הקבצים המופיעים ברשימה באמצעות הפקודה mv רק כדי להזין סיומת. (עכשיו כדי לרשום את הקובץ נצטרך להשתמש בשילוב "$ 0" בכל פעם שנצטרך להשתמש בו)

ls --directory /camino/a/carpeta/*.ext | sed 's/^/"/' | sed 's/$/"/' | awk '{print "mv "$0" \"`dirname

"$ 0 ″" / Text-any-`basename "$ 0 ″" \ ""} '| ש

הערה מתווספת בסוף כפי שמוצג ברצף הקודם את השילוב « | ש »אשר מפנה את הצינור למתורגמן זה

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

דוגמאות:

1- המר את כל ה- pdfs המופיעים בקובצי טקסט.

ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print "pdftotext",$0}' | sh

במקרה זה אין צורך לבחור קובץ פלט מכיוון ש- pdftotext מייצר אוטומטית קובץ טקסט עם שם הבסיס ופטור ה- .txt אם ורק אם אתה עובד עם קובץ יחיד.

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

ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print FS="convert -wave 25x150

"$0"","\"\`dirname "$0"`/`basename "$0" | sed '"'"s/\\\\.[[:alnum:]]*$//"'"'`-wave.`basename "$0" |
rev | awk -F . \'"'"'\{print $1}\'"'"'\ | rev`'""'\"\'""' "}' | sh

הערה: מספר מעברים נעשים ברצף זה:

  • אחת כדי להשיג את התיקיה שבה נמצא הקובץ עם dirname
  • עוד כדי להשיג את שם הבסיס, אך הסרת הסיומת של הקובץ האמור
  • אחר לקבלת הפטור של התיק האמור.

3- בואו נראה כעת כיצד לשנות את שם קבוצת הקבצים על ידי הצבת המספר המתאים לפני השם (סיומת מספרית).

ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print FS="mv "$0" '""'\"\'""'`dirname
"$0"`/"FNR"-`basename "$0"`'""'\"\'""' "}' | sh

כדי להזין את המספר, נעשה שימוש בשפת ה- awk הפנימית עם האפשרות "FNR" המפרטת כל שורת פלט, כך שאפשר למקם את המספר לפני או אחרי הטקסט.

בואו נראה איך לשים קידומת מספרית (שים מספר בסוף, אבל לפני הפטור) אפשרות זו תקפה רק אם לקובץ יש.

ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print FS="mv "$0" \"`dirname
"$0"`/`basename "$0" | sed '\'s/\\\\.[[:alnum:]]*$//\''`-"FNR".`echo "$0" | rev | awk -F .
'""'\'\'""'{print $1}'""'\'\'""' | rev `\" " }' | sh

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

zenity --entry --hide-text --text "introduzca la clave de desbloqueo" > $HOME/.cat && ls
--directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print FS="pdftk "$0" input_pw `cat
$HOME/.cat` output \"`dirname "$0"`/`basename "$0" .pdf`-unlock.pdf\" "}' | sh && rm
$HOME/.cat

תלוי בגרסת הנימוס, האפשרות לסיסמה יכולה להיות רק - סיסמה.

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

5- כלי עזר נוסף הוא כאשר אנו צריכים לדחוס כמה קבצים דחוסים ב- zip

ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print "unzip -x "$0" "}' | sh

יש להפריד בין הצעות המחיר הנוספות עם רווח בו משתמשים באופציה "$ 0"
לדוגמה
"unzip -x "$0" "

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

zenity --separator " " --multiple --text "Seleccione los Opciones que quiere permitir" --column "Opciones" --list "Printing" "DegradedPrinting" "ModifyContents" "CopyContents" "ScreenReaders" "ModifyAnnotations" "AllFeatures" > $HOME/.cat && zenity --entry --hidetext --text "Teclee la contraseña de protección" > $HOME/.cat2 && ls --directory "$@" | sed 's/^/"/' | sed 's/$/"/' | awk '{print FS="echo \"pdftk \\\"`echo "$0"`\\\" output \\\"`dirname "$0"`/`basename "$0" .pdf`-locked.pdf\\\" allow `cat $HOME/.cat` owner_pw \"`cat $HOME/.cat2`\"\" | sh "}' | sh && rm $HOME/.cat $HOME/.cat2

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

אפשרות זו יכולה להיות שימושית מאוד אם ברצוננו להמיר קבוצה שלמה של קטעי וידאו עם mencoder מבלי שאלה יצטרפו אליהם לאחד; אתה יכול להכין תסריט לזה והם פשוט יצטרכו לשים ls --directory %F | sed 's/^/"/' | sed 's/$/"/' | awk '{print "script-convertir-video "$0" "}' | sh && zenity --info --text "Todas las conversiones han terminado"

סנפיר


השאירו את התגובה שלכם

כתובת הדוא"ל שלך לא תפורסם. שדות חובה מסומנים *

*

*

  1. אחראי לנתונים: מיגל אנחל גטון
  2. מטרת הנתונים: בקרת ספאם, ניהול תגובות.
  3. לגיטימציה: הסכמתך
  4. מסירת הנתונים: הנתונים לא יועברו לצדדים שלישיים אלא בהתחייבות חוקית.
  5. אחסון נתונים: מסד נתונים המתארח על ידי Occentus Networks (EU)
  6. זכויות: בכל עת תוכל להגביל, לשחזר ולמחוק את המידע שלך.

  1.   ראמירו דיג'ו

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

  2.   קרוטו דיג'ו

    האמת, יש לך ידע רב על פקודות לינוקס. שימושי מאוד!

    1.    KZKG ^ גאארה דיג'ו

      כן, אני יודע שנלמד איתו המון כאן חחחח.

  3.   הקסבורג דיג'ו

    אני חושב שזה הרבה יותר קל:

    ls -d /path/to/folder/*.ext | תוך כדי קריאת קובץ; בצע את הפקודה "$ file"; בוצע

    במקום COMMAND אתה יכול לשים כל מה שאתה רוצה וזה עובד גם אם הקבצים מכילים רווחים ריקים כל עוד אתה שם קובץ $ בין הצעות מחיר. אתה לא צריך להשתמש ב- sed בשביל זה או ליצור פקודות עם awk. כמו כן זה משגר פחות תהליכים.

    1.    אנק דיג'ו

      o:
      עבור i ב- $ (ls -d /path/a/folder/*.ext); לעשות פקודה "$ i"; בוצע;

      1.    הקסבורג דיג'ו

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

        1.    טאהד דיג'ו

          למעשה, הקסבורג היא הסיבה לכך שטקסט הפלט צוטט בתחילת ובסוף עבור כל שורה עם אפשרות זו:
          ls - ספריה | sed 's / ^ / »/' | sed 's / $ / »/'

          אני מבהיר שניתן להשתמש במציאה לחיפוש בספריות המשנה.

          1.    הקסבורג דיג'ו

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

          2.    הוגו דיג'ו

            אני מסכים שבמציאת זה יכול להיות פחות מסורבל. בואו ניקח דוגמה זו מהמאמר:

            ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print "pdftotext",$0}' | sh

            ניתן בהחלט לבצע את אותו הדבר כך, וכנראה שהוא יפעל מהר יותר:

            find . -type f -print0 | xargs -0 pdftotext

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

        2.    אנק דיג'ו

          אם אתה מבחין שה- $ i נמצא במרכאות. זה הופך את הבריחה מהחלל הלבן למיותר.

          1.    הקסבורג דיג'ו

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

  4.   ליאו דיג'ו

    טוב מאוד, מורכב, אבל מאוד מעניין.

  5.   helena_ryuu דיג'ו

    זה מדהים, נהדר !!!!

  6.   MSX דיג'ו

    מצוין, לפלסטיות של GNU / Linux אין גבולות.

  7.   נטליה דיג'ו

    בלוגר יקר,

    אני נטליה, מנהלת תקשורת ב- Paperblog. לאחר שגיליתי את זה, אני יוצר איתך קשר כדי להזמין אותך להכיר את פרויקט Paperblog, http://es.paperblog.com, שירות עיתונאות אזרח חדש. Paperblog היא פלטפורמה דיגיטלית שכמו מגזין בלוגים מפרסמת את מיטב המאמרים של הבלוגים הרשומים.

    אם הרעיון מעניין אותך, אתה רק צריך להציע את הבלוג שלך להשתתף. המאמרים ילוו בשמך / שם בדוי ובקובץ הפרופיל שלך, וכן במספר קישורים לבלוג המקורי, בתחילתו ובסוף כל אחד מהם. הצוות יכול לבחור את המעניינים ביותר שיופיעו בעמוד השער ואתה יכול להיבחר בתור מחבר היום.

    אני מקווה שמניע אותך מהפרויקט שהתחלנו בהתלהבות כזו בינואר 2010. הסתכל ומוזמן לכתוב לי לקבלת פרטים נוספים.

    קבל ברכה לבבית וחיבה,
    נטליה