ווטסאפ - לינוקס, BSD, קוד פתוח ותוכנה חופשית בעברית. Whatsup - Linux, BSD, open source and free software in Hebrew

 
 
  כניסת חברים · רישום · שכחתי סיסמה  
tux the penguin
תגובה לנושא
צפיה בנושא הבא Printable version התחבר כדי לבדוק הודעות פרטיות צפיה בנושא הקודם
whoisaאורח · ·
 

הודעה פורסם: 31/07/2007 - 21:25
נושא ההודעה: חיתוך מחרוזות ב-bash

קטונתי מלתת פה טיפים אבל פשוט יש משהו שפשוט תמיד הפריע לי ב- bash: איך עושים rename ווינדוס סטייל (ren *.c *.bak) למשל כי mv במקרה הזה יעשה נזק בלתי הפיך:

קוד:

$ echo mv *.c *.bak
mv aesxam.c bignum.c calc.c example1.c example2.c hello.c readline.c readparam.c readparams.c *.bak


הפיתרון שמצאתי הוא חיתוך מחרוזות (string "chopping"):

קוד:

$ for i in *.c; do echo mv $i ${i%%.*}.bak ; done;
mv aesxam.c aesxam.bak
mv bignum.c bignum.bak
mv calc.c calc.bak
mv example1.c example1.bak
mv example2.c example2.bak
mv hello.c hello.bak
mv readline.c readline.bak
mv readparam.c readparam.bak
mv readparams.c readparams.bak


הביטוי ${i%%.*{ חותך את המחרוזת מתחילתה על לנקודה האחרונה (כלומר עד ל- .*).
אני יודע שיש גם פקודה rename אבל זה נראה לי יותר קריא ומובן.
 
   
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
mksoftלא בפורום כעתSite Admin ת.הצטרפות: 17/03/2002 · הודעות: 10514 · מיקום: כדור הארץ
 

הודעה פורסם: 31/07/2007 - 21:40
נושא ההודעה:

אם כבר, אולי במקום החיתוך אפשר להשתמש בהחלפה:
קוד:
for i in *.c; do echo mv $i ${i/.*/.bak} ; done;


בכל מקרה זה עשוי להיות בעייתי אם יש בשם הקובץ יותר מנקודה אחת.
 
 צפיה בפרופיל המשתמש שלח הודעה פרטית שלח דוא\ ביקור באתר המפרסם  
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
עידולא בפורום כעת ת.הצטרפות: 28/11/2003 · הודעות: 1816 · מיקום: dev/null/
 

הודעה פורסם: 31/07/2007 - 22:47
נושא ההודעה:

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

לדוגמא, עם הקבצים הנ"ל, ניתן לשנות את שמם בקלות באמצעות הפקודה:
קוד:
rename 's/\.c$/\.bak/' *.c


אם אתם לא בטוחים ביכולת הביטויים הרגולרים שלכם, תוכלו להשתמש בדגל n- שמדפיס למסך את השינויים שיעשו לקבצים, אבל לא משנה את הקבצים בתכל'ס
 
 צפיה בפרופיל המשתמש שלח הודעה פרטית ביקור באתר המפרסם  
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
whoisaאורח · ·
 

הודעה פורסם: 31/07/2007 - 23:02
נושא ההודעה:

mksoft :
אם כבר, אולי במקום החיתוך אפשר להשתמש בהחלפה:
קוד:
for i in *.c; do echo mv $i ${i/.*/.bak} ; done;


בכל מקרה זה עשוי להיות בעייתי אם יש בשם הקובץ יותר מנקודה אחת.


לא זה יקח את המחורזת הארוכה ביותר שהוא מוצא, לכן אין בעיה עם יותר מנקודה אחת.
לגבי rename זה פחות "טבעי" בשבילי (אני לא בטוח שאנחנו מדברים על אותו rename) ובכל מקרה זה יותר גמיש כי ניתן לשלב את זה למשל עם find.
כאמור זה מימוש מסויים שנראה לי מועיל אבל את החיתוך של מחרוזות ניתן להשתמש ב- bash גם לצרכים אחרים. אגב שימוש ב- ## במקום ב- %% יחתוך את המחרוזת מתחילתה (כלומר מהמקום בו נמצאה התאמה).


קוד:

STRING=notingtoknow.txt
echo ${STRING##*no}
w.txt



 
   
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
mksoftלא בפורום כעתSite Admin ת.הצטרפות: 17/03/2002 · הודעות: 10514 · מיקום: כדור הארץ
 

הודעה פורסם: 31/07/2007 - 23:08
נושא ההודעה:

זה נכון במקרים של שמות כמו .c, אך מה שחשבתי עליו הוא משהו כללי יותר (למקרה הפרטי הנ"ל הז כמובן בסדר), בסגנון code.tar.gz זה משנה ל-code.bak ואז בעייתי מבחינת זיהוי הקובץ.

בעיה נוספת היא מה קורה כאשר רוצים להעביר שני סוגי קבצים עם שמות שונים ל-bak. כגון foo.c ו-foo.h במקרה כזה אחד יילך לאיבוד. משער שהאסטרטגיה הנכונה תהיה פשוט להוסיף את ה-bak בסוף.

ואם רוצים להתאים את זה לסוגי קבצי שונים לא לשכוח לעטוף בגרשיים את שמות הקבצים ב-mv כדי לטפל נכונה בקבצים עם רווחים בשם.
 
 צפיה בפרופיל המשתמש שלח הודעה פרטית שלח דוא\ ביקור באתר המפרסם  
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
yehudaלא בפורום כעתSite Admin ת.הצטרפות: 23/02/2002 · הודעות: 798 ·
 

הודעה פורסם: 31/07/2007 - 23:22
נושא ההודעה:

עוד מספר דוגמאות לשינוי שמות ניתן למצוא כאן:
http://www.debian-administration.org/articles/150
http://www.basicallytech.com/blog/?/archives/10-Shell-stuff-rename-multiple-files-on-the-command-line.html
 
 צפיה בפרופיל המשתמש שלח הודעה פרטית שלח דוא\ ביקור באתר המפרסם מספר ICQ 
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
whoisaאורח · ·
 

הודעה פורסם: 01/08/2007 - 08:19
נושא ההודעה:

במקרה כזה ניתן להשתמש ב- % אחד שמוצא את המחרוזה הקצרה ביותר:

קוד:

STRING=code.tar.gz
echo ${STRING%%.*}
code
echo ${STRING%.*}
code.tar


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

הודעה פורסם: 01/08/2007 - 12:14
נושא ההודעה:

ולא הזכרנו את הפקודה basename:

למשל,

קוד:
mv file.c $(basename file.c .c).tmp


וגם את רעותה dirname. למשל:
קוד:

THEFILE=/home/foo/bar.c
mv $THEFILE $(dirname $THEFILE)/$(basename $THEFILE .c).tmp



(כדי לשנות את הסיומת של שם קובץ שנתון לנו ה path המלא מ .c ל .tmp)
 
   
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
mksoftלא בפורום כעתSite Admin ת.הצטרפות: 17/03/2002 · הודעות: 10514 · מיקום: כדור הארץ
 

הודעה פורסם: 01/08/2007 - 12:26
נושא ההודעה:

הבעיה עם השימוש ב-basename היא שאתה צריך לציין יותר מפעם אחת את הסיומת המקורית של הקבצים בעוד בשיטות שהוזכרו כאן בדיון זה מתבצע פעם אחת.
 
 צפיה בפרופיל המשתמש שלח הודעה פרטית שלח דוא\ ביקור באתר המפרסם  
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
shlomi-lלא בפורום כעת ת.הצטרפות: 04/05/2003 · הודעות: 1399 ·
 

הודעה פורסם: 02/08/2007 - 00:14
נושא ההודעה:

יש גם את זה:
http://debaday.debian.net/2007/06/13/mmv-mass-moving-and-renaming-files/

... אם כי ממש לא קשור לבאש

_________________
________________________________
http://shlomil.blogspot.com/
 
 צפיה בפרופיל המשתמש שלח הודעה פרטית ביקור באתר המפרסם MSN Messenger  
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
הצגת הודעות מלפני:     
מעבר אל:  
כל הזמנים הם GMT + 2 שעות
תגובה לנושא
צפיה בנושא הבא Printable version התחבר כדי לבדוק הודעות פרטיות צפיה בנושא הקודם
PNphpBB2 © 2003-2004 

תוכן הדיון

  1. אורח [whoisa]
  2. mksoft
  3. עידו
  4. אורח [whoisa]
  5. mksoft
  6. yehuda
  7. אורח [whoisa]
  8. אורח [עמית]
  9. mksoft
  10. shlomi-l