פעמים רבות אנו צריכים להריץ סקריפט כדי להמיר קובץ 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
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
בואו נראה איך לשים קידומת מספרית (שים מספר בסוף, אבל לפני הפטור) אפשרות זו תקפה רק אם לקובץ יש.
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
לדוגמה
"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
עם דוגמאות אלה, זה די מודגם כיצד להשתמש באפשרות זו כדי להמיר, לשנות או לשנות שם של מספר קבצים עם סקריפט יחיד ולא להמיר אותם ביד אחד אחד. צריכת הזיכרון עם אפשרות זו היא מינימלית, תלוי בפקודה בה משתמשים, מכיוון שהיא אינה ממירה אותם בו זמנית אלא בזה אחר זה.
ls --directory %F | sed 's/^/"/' | sed 's/$/"/' | awk '{print "script-convertir-video "$0" "}' | sh && zenity --info --text "Todas las conversiones han terminado"
סנפיר
האם זה לא יהיה הרבה, אבל הרבה יותר קל לעשות את כל זה באמצעות ביטויים רגילים או תווים כלליים? אני לא מבין מה ההבדל בין זה לבין להפוך את החיים שלך כל כך מסובכים עם זה.
האמת, יש לך ידע רב על פקודות לינוקס. שימושי מאוד!
כן, אני יודע שנלמד איתו המון כאן חחחח.
אני חושב שזה הרבה יותר קל:
ls -d /path/to/folder/*.ext | תוך כדי קריאת קובץ; בצע את הפקודה "$ file"; בוצע
במקום COMMAND אתה יכול לשים כל מה שאתה רוצה וזה עובד גם אם הקבצים מכילים רווחים ריקים כל עוד אתה שם קובץ $ בין הצעות מחיר. אתה לא צריך להשתמש ב- sed בשביל זה או ליצור פקודות עם awk. כמו כן זה משגר פחות תהליכים.
o:
עבור i ב- $ (ls -d /path/a/folder/*.ext); לעשות פקודה "$ i"; בוצע;
זה נראה טוב, אבל אם שמות הקבצים מכילים ריקים זה לא עובד. 🙂
למעשה, הקסבורג היא הסיבה לכך שטקסט הפלט צוטט בתחילת ובסוף עבור כל שורה עם אפשרות זו:
ls - ספריה | sed 's / ^ / »/' | sed 's / $ / »/'
אני מבהיר שניתן להשתמש במציאה לחיפוש בספריות המשנה.
אבל עם הטריק שלי אתה לא צריך. ls מוציא את שמות הקבצים המלאים בכל שורה וקורא קורא שורה אחר שורה ומשאיר את שם הקובץ במשתנה הקובץ בין אם יש בו רווחים ריקים ובין אם לאו. אתה רק צריך לשים הצעות מחיר סביב קובץ $ כאשר אתה משתמש בו בפקודה.
אני מסכים שבמציאת זה יכול להיות פחות מסורבל. בואו ניקח דוגמה זו מהמאמר:
ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print "pdftotext",$0}' | sh
ניתן בהחלט לבצע את אותו הדבר כך, וכנראה שהוא יפעל מהר יותר:
find . -type f -print0 | xargs -0 pdftotext
עם זאת, המאמר מתקבל בברכה, תמיד טוב ללמוד על דרכים חלופיות לעשות משהו.
אם אתה מבחין שה- $ i נמצא במרכאות. זה הופך את הבריחה מהחלל הלבן למיותר.
כן, אך האופרטור $ () מרחיב את שמות הקבצים מבלי להציב מרכאות בשום מקום, כך שהמשתנה i כבר תופס את שמות הקבצים שנחתכו. נסה זאת במסוף בספרייה המכיל קבצים עם רווחים בשמות.
טוב מאוד, מורכב, אבל מאוד מעניין.
זה מדהים, נהדר !!!!
מצוין, לפלסטיות של GNU / Linux אין גבולות.
בלוגר יקר,
אני נטליה, מנהלת תקשורת ב- Paperblog. לאחר שגיליתי את זה, אני יוצר איתך קשר כדי להזמין אותך להכיר את פרויקט Paperblog, http://es.paperblog.com, שירות עיתונאות אזרח חדש. Paperblog היא פלטפורמה דיגיטלית שכמו מגזין בלוגים מפרסמת את מיטב המאמרים של הבלוגים הרשומים.
אם הרעיון מעניין אותך, אתה רק צריך להציע את הבלוג שלך להשתתף. המאמרים ילוו בשמך / שם בדוי ובקובץ הפרופיל שלך, וכן במספר קישורים לבלוג המקורי, בתחילתו ובסוף כל אחד מהם. הצוות יכול לבחור את המעניינים ביותר שיופיעו בעמוד השער ואתה יכול להיבחר בתור מחבר היום.
אני מקווה שמניע אותך מהפרויקט שהתחלנו בהתלהבות כזו בינואר 2010. הסתכל ומוזמן לכתוב לי לקבלת פרטים נוספים.
קבל ברכה לבבית וחיבה,
נטליה