|
15-11-2005, 17:49
|
|
|
חבר מתאריך: 09.05.05
הודעות: 1,217
|
|
אתה רק מוכיח את הטענה שלי. אין פקודה כזאת. זה לא משנה כמה "פקודות" (ל-מה אנחנו קוראים פקודות לעזאזל, ל-coreutils? אם כן, אל תתיחס למשפט הבא) אתה תדע, אתה לא תכיר את כולן.
ובטח שלא תוכל לקרוא את כל ה-manual של כל ה"פקודות" שאתה מכיר, בשביל לבדוק איך עושים כל דבר.
בכל מקרה, מה שכתבת אולי משלים את הייעוד שלו, אבל לא כתוב בצורה היפה, הטובה או היעילה ביותר.
קודם כל, לפעולות כאלה לא משתמשים ב-print אלא ב-print0. תקרא ב-manpage למה בדיוק.
יש לך שגיאת סינטקס. הנה היא:
find: warning: you have specified the -maxdepth option after a non-option argume nt -type, but options are not positional (-maxdepth affects tests specified befo re it as well as those specified after it). Please specify options before other arguments.
לא היית צריך להשתמש ב-pipe הזה, ולא היית צריך להשתמש ב-xargs. הדברים האלה כבר קיימים בתוך find (ד"א, תוכנה מעולה).
אה, וגם השתמשת ב-!\ שהוא לא קריא לחלוטין לעומת not-.
הנה דרך מומלצת יותר לעשות את זה:
קוד:
IGNORE THIS LINE
find . -maxdepth 1 -not \( -name bla1 -o -name bla2 \) -type f -exec rm {} +
IGNORE THIS LINE
הכלל הפשוט ביוניקס (ובלינוקס) הוא שבמקום להשתמש ב-3 פקודות, לבחור בפרמטרים לא טובים להעברת שמות של קבצים, אף על פי שכתוב בצורה מפורשת ב-manpage שצריך להשתמש בדרך אחרת, לעשות שגיאת syntax בפקודת ה-find, לכתוב בדרך בלתי קריאה ולהשתמש ב-2 נתיבים שהם לא בהכרח נכונים, צריך פשוט לקרוא את ה-manpage ולחשוב על דרך יותר טובה.
בוא תנסה לפשט את הדבר הבא, למספר פקודות פשוטות ב-bash:
יש לי גישת FTP למחשב אחר ברשת הפנימית שלי. בתוך תיקיית ה-root של השרת (אליה יש לי גישה כמובן) יש כ-40,000 תיקיות. כל תיקייה נקראת על שם של תוכנה כלשהי, ומייד אחרי גרסא מופרדת במקף. לדוגמא: application-2.5.10
בתוך התיקייה יש תמיד 4 קבצים:
1. DESC - ב-3 השורות הראשונות של הקובץ יש הסבר קצר על התוכנה, רווח של שורה, ואז הסבר מפורט על התוכנה.
2. AUTH - בתוך הקובץ הזה יש רשימה של יוצרי התוכנה. כל שם בשורה.
3. HASH - קובץ שבו יש תמיד רק 6 שורות: MD5SUM של הקבצים 1,2,4, כל אחד בשורה, ולאחר מכן SHA1SUM של הקבצים 1,2,4.
4. x.tar.gz - כאשר x="שם התיקייה" שאתה נמצא בה. זוהי התוכנה עצמה.
המטרה היא לכתוב תוכנית כלשהי, שתתחבר דרך פרוטוקול FTP, תכנס לכל תיקייה בשרת הנ"ל, ותוודא שהקובץ HASH מכיל פרטים נכונים.
היא תכין רשימה של אילו קבצים לא מכילים את הפרטים הנכונים ותשלח אותה באימייל ל-a@a.net.
בינתיים, התוכנית תאזין לפורט 10666 דרך xinetd, מפני שכאשר בעל תיבת האימייל יראה את ההודעה, הוא ישלח מידע דרך פאקט UDP לפורט 10666, שיכיל את המילה yes או no, באמצעות תוכנה שכבר נבנתה בדיוק בשביל צורך זה.
אם מתקבלת התשובה no, התוכנה תתחבר לשרת בשנית, ותמחק את כל הקבצים מן התיקיות שבהן ההאשים לא התאימו. התיקייה תשאר ריקה, אבל שמה ישונה ל-x-CRPTD, כאשר x="שם התיקייה" הקודם. זה יסמל שהתיקייה הכילה קבצים פגומים ובגלל זה הם נמחקו.
התוכנה צריכה לעשות את הפעולה הזאת בגל 259200 שניות. כאשר בפעמים הבאות (אחרי הפעם הבאה, המתוארת כאן) היא לא תטרח להכנס לתיקיות ששמן מסתיים ב-CRPTD.
הערות כלליות:
אם אחד הקבצים שציפינו לו לא נמצא בתיקייה: שם התיקייה ישלח בנפרד מן הרשימה הראשית אל האימייל של המשתמש, ביחד עם שם הקובץ שחסר.
אם אחד הקבצים ריק, זה יחשב לזה שהוא לא מתאים לקובץ HASH.
אם קובץ ה-HASH ריק, זה יחשב לזה ששום קובץ לא התאים להאשים.
אם יש יותר מ-4 קבצים, התוכנה תמחק את הקבצים המיותרים.
אם אין מספיק הרשאות בשביל לבצע את אחת מהפעולות, התוכנה תנסה לשנות את ההרשאות, ואם היא לא מצליחה מחוסר הרשאות, היא תשלח אימייל לכתובת האימייל שלמעלה ביחד עם שם התיקייה בצירוף השגיאה PERMISSION DENIED.
הכלים שעומדים לרשותך: bash, coreutils ומערכת לינוקס עם קרנל 2.4.27 עם הפאצ'ים של דביאן.
במחשב הזה יש לך הרשאות לעשות רק את הדברים שאתה אמור לעשות, ולא שום דבר אחר. זאת אומרת: הרשאה לפתוח סוקטים, לכתוב ולקרוא ל-tmp ותיקיית הבית שלך, וגישות סטנדרטיות אחרות כמו dev/null/ שבאות ב-default עם מערכת דביאן woodie מ-netinst ללא התקנה של שום חבילה מלבד bash ו-coreutils.
שים לב: למחשב אין חיבור לאינטרנט. הוא מחובר למחשב אחד ויחיד שהוא שרת ה-FTP.
אם ממש משעמם לך, אני יכול גם משהו שצריך לחשוב עליו (כמו רקורסיה למשל).
נערך לאחרונה ע"י ^NoX בתאריך 15-11-2005 בשעה 17:55.
|
|