דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. עזרה | סקריפט באש למחיקת קבצים מורכבת

עזרה | סקריפט באש למחיקת קבצים מורכבת

מתוזמן נעוץ נעול הועבר תכנות
22 פוסטים 6 כותבים 378 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • dovidD מחובר
    dovidD מחובר
    dovid ניהול
    השיב לWWW ב נערך לאחרונה על ידי dovid
    #8

    @WWW בקיצור אתה רוצה משהו שעושה את זה בשורה בודדת.
    הדוגמה שהבאת זה לא נקרא בכלל באש, זה נקרא פקודה.
    כשאתה כותב "סקריפט באש" זה מצלצל יותר משורה אחת (אחרת זה לא בדיוק סקריפט)
    וזה עוד לפני עם הנושא אותו כתבת, שתיארתי לעצמי שתקבל איזה 40 שורות מורכבות מאוד מיוסי...
    יש מצב אולי בpowershell לעשות כזה דבר בשורה קצת מורכבת, צריך להתקין אותו בשרת כמובן.

    מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

    בכל נושא אפשר ליצור קשר dovid@tchumim.com

    WWWW תגובה 1 תגובה אחרונה
    2
    • WWWW מנותק
      WWWW מנותק
      WWW
      השיב לdovid ב נערך לאחרונה על ידי
      #9

      @dovid אמר בעזרה | סקריפט באש למחיקת קבצים מורכבת:

      @WWW בקיצור אתה רוצה משהו שעושה את זה בשורה בודדת.
      כשאתה כותב "סקריפט באש" זה מצלצל יותר משורה אחת (אחרת זה לא בדיוק סקריפט)
      וזה עוד לפני עם הנושא אותו כתבת, שתיארתי לעצמי שתקבל איזה 40 שורות מורכבות מאוד מיוסי...

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

      הנושא הוא יותר עקרונית, בPHP אני אעשה את זה ככה פחות או יותר:

      קבלת מערך של כל התיקיות המתאימות > לעבור עם לולאה על המערך > לקבל מערך של כל הקבצים בתיקיה > למיין > להשמיט 100 קבצים אחרונים (מסוג אחד) > לעבור עם לולאה על הקבצים שנותרו במערך ולבדוק כ"א אם עבר 30 יום, וא"כ למחוק אותו.

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

      הנה פתרון חלקי לבעיה דומה לשלי בשורה אחת:
      https://stackoverflow.com/a/16193273/14730780
      (זה בכלל לא מענה לבעיה שלי, כי א"א לשלב בזה -mtime +30, וכן אצטרך לעבור עם לולאה על כל התיקיות).
      רק ש @yossiz טען לי (בפרטי) שעדיף כבר להשתמש ב PHP, כי זה יהיה יותר קל לתחזוקה.

      WWW.netfree@gmail.com || קשבק! החזר כספי לבנק על רכישות באינטרנט || עונים על סקרים ומרוויחים כסף!

      dovidD תגובה 1 תגובה אחרונה
      1
      • dovidD מחובר
        dovidD מחובר
        dovid ניהול
        השיב לWWW ב נערך לאחרונה על ידי
        #10

        @WWW אמר בעזרה | סקריפט באש למחיקת קבצים מורכבת:

        קבלת מערך של כל התיקיות המתאימות > לעבור עם לולאה על המערך > לקבל מערך של כל הקבצים בתיקיה > למיין > להשמיט 100 קבצים אחרונים (מסוג אחד) > לעבור עם לולאה על הקבצים שנותרו במערך ולבדוק כ"א אם עבר 30 יום, וא"כ למחוק אותו.

        בשפת תכנות אתה יכול לעשות מאוד אלגנטי את מה שאמרת.
        הרעיון הוא להתחיל ממשמות קטנות ולחבר ביחד או הפוך, וככה יש לך יחידות קטנות שעובדות ביחד כמערכת.
        אני עד עכשיו לא הבנתי מה אתה מתכוון (א. מה זה סוג, סיומת? ב. מאה להשאיר והשאר להשמיט? ג. התנאי של החודש הוא בנוסף (AND) לתנאי של המאה או שהוא OR.
        בכל מקרה אומר לך איך הייתי עושה:
        א. פונקציה שמחזירה רקורסיבית את כל הקבצים
        ב. קיבוץ לפי סוג ע"י השמה במערך אסוציאטיבי
        ג. מעבר על קבוצות הסוגים, בכל קבוצה לבצע מיון, ומחיקת הגדולים ו/או הישנים.

        מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

        בכל נושא אפשר ליצור קשר dovid@tchumim.com

        WWWW תגובה 1 תגובה אחרונה
        0
        • WWWW מנותק
          WWWW מנותק
          WWW
          השיב לdovid ב נערך לאחרונה על ידי WWW
          #11

          @dovid אמר בעזרה | סקריפט באש למחיקת קבצים מורכבת:

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

          לא הבנתי.

          אני עד עכשיו לא הבנתי מה אתה מתכוון (א. מה זה סוג, סיומת? ב. מאה להשאיר והשאר להשמיט? ג. התנאי של החודש הוא בנוסף (AND) לתנאי של המאה או שהוא OR.

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

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

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

          Those of you with PHP 5 don't have to come up with these wild functions to scan a directory recursively: the SPL can do it.
          
          <?php
          
          $dir_iterator = new RecursiveDirectoryIterator("/path");
          $iterator = new RecursiveIteratorIterator($dir_iterator, RecursiveIteratorIterator::SELF_FIRST);
          // could use CHILD_FIRST if you so wish
          
          foreach ($iterator as $file) {
              echo $file, "\n";
          }
          
          ?>
          
          Not to mention the fact that $file will be an SplFileInfo class, so you can do powerful stuff really easily:
          
          <?php
          
          $size = 0;
          foreach ($iterator as $file) {
              if ($file->isFile()) {
                  echo substr($file->getPathname(), 27) . ": " . $file->getSize() . " B; modified " . date("Y-m-d", $file->getMTime()) . "\n";
                  $size += $file->getSize();
              }
          }
          
          echo "\nTotal file size: ", $size, " bytes\n";
          
          ?>
          
          \Luna\luna.msstyles: 4190352 B; modified 2008-04-13
          \Luna\Shell\Homestead\shellstyle.dll: 362496 B; modified 2006-02-28
          \Luna\Shell\Metallic\shellstyle.dll: 362496 B; modified 2006-02-28
          \Luna\Shell\NormalColor\shellstyle.dll: 361472 B; modified 2006-02-28
          \Luna.theme: 1222 B; modified 2006-02-28
          \Windows Classic.theme: 3025 B; modified 2006-02-28
          
          Total file size: 5281063 bytes
          
          

          ?

          WWW.netfree@gmail.com || קשבק! החזר כספי לבנק על רכישות באינטרנט || עונים על סקרים ומרוויחים כסף!

          dovidD תגובה 1 תגובה אחרונה
          0
          • רפאלר מנותק
            רפאלר מנותק
            רפאל
            השיב לyossiz ב נערך לאחרונה על ידי רפאל
            #12

            @yossiz אמר בעזרה | סקריפט באש למחיקת קבצים מורכבת:

            php << EOF
            // your code here
            EOF
            

            למי שתהה לגבי התחביר מדובר בHere Document המהווה כלי שימושי בין השאר להצבת מחרוזות מרובות שורות לתוך משתנים, קבצים או Pipes.

            התחביר:

            [COMMAND] <<[-] 'DELIMITER'
              HERE-DOCUMENT
            DELIMITER
            

             

            הסבר התחביר בקצרה:

            COMMAND שם הקובץ\Pipe
            [-]>> (Redirection Operator) הפנית התוכן של הHERE-DOCUMENT לStdin של הפקודה שקדמה לאופרטור, באנלוגיה לInput Redirection העושה שימוש בסימן "קטן מ" (>) בודד: cat < file (וזאת מכיוון שהShell מתייחס לHERE-DOCUMENT כקובץ בפני עצמו [Stream Literal]). (הוספת מינוס לאופרטור אופציונלית ותגרום לShell להתעלם מטאבים פותחים בשורות הקלט)
            DELIMITER מחרוזת שתשמש כאינדיקציה לסיום קבלת הקלט (כדי שתתפרש כך, על המחרוזת להופיע בקלט כשורה בפני עצמה ללא רווחים פותחים או סוגרים)
            HERE-DOCUMENT הקלט (מחרוזות, משתנים וכן כל סוג אחר של Input)

             

            דוגמא

            cat << hello
            

            העבר לcat את הקלט שתקבל, סיים את קבלת הקלט כשהמילה hello מופיעה.

            תגובה 1 תגובה אחרונה
            5
            • dovidD מחובר
              dovidD מחובר
              dovid ניהול
              השיב לWWW ב נערך לאחרונה על ידי
              #13

              @WWW תעשה פונקציה שמטפלת בתיקה בודדת.

              1. מקבלת פרמטר את שם התיקיה
              2. אוספת את כל הקבצים הישנים מחודש אחורה לתוך מערך אסוסיאציבי, שהמפתחות הם הסיומות.
              3. עוברת בלולאה על איברי המערך הסוסיאציבי וא. ממיינת לפי שם בסדר יורד, ב. בודקת את אורך המערך, ג. מוחקת את הN הראשונים.

              מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

              בכל נושא אפשר ליצור קשר dovid@tchumim.com

              WWWW תגובה 1 תגובה אחרונה
              2
              • D מנותק
                D מנותק
                davidnead
                כתב ב נערך לאחרונה על ידי
                #14

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

                echo "Deleting zip files older than %retaindays% days now"
                Forfiles -p %_destFolder%\ -s -m *.* -d -%retaindays% -c "cmd /c del /q @path"
                

                אני חושב שזה מה שאתה מחפש. ואידך, זיל גמור.

                dovidD תגובה 1 תגובה אחרונה
                0
                • dovidD מחובר
                  dovidD מחובר
                  dovid ניהול
                  השיב לdavidnead ב נערך לאחרונה על ידי
                  #15

                  @davidnead יש מצב שלא קראת את השאלה?

                  מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                  בכל נושא אפשר ליצור קשר dovid@tchumim.com

                  תגובה 1 תגובה אחרונה
                  1
                  • WWWW מנותק
                    WWWW מנותק
                    WWW
                    השיב לdovid ב נערך לאחרונה על ידי
                    #16

                    @dovid אמר בעזרה | סקריפט באש למחיקת קבצים מורכבת:

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

                    יש דבר כזה בPHP? (בלי shell_exec)

                    WWW.netfree@gmail.com || קשבק! החזר כספי לבנק על רכישות באינטרנט || עונים על סקרים ומרוויחים כסף!

                    dovidD תגובה 1 תגובה אחרונה
                    0
                    • dovidD מחובר
                      dovidD מחובר
                      dovid ניהול
                      השיב לWWW ב נערך לאחרונה על ידי
                      #17

                      @WWW
                      למה לא? אתה בודק את הזמן של הקובץ, מה הבעיה?
                      כתבתי את הפונקציה:

                      function dirHandel($dir, $until_date, $limit)
                      {
                          $res_by_ext  = array();
                      
                          foreach (new DirectoryIterator($dir) as $fileInfo) 
                              if ($fileInfo->getCTime() < $until_date) {
                                  $ext = $fileInfo->getExtension();
                                  if ($ext)
                                      $res_by_ext[$ext][] = $fileInfo->getFilename();
                              }
                      
                          foreach ($res_by_ext as $file_type => $files_array) {
                              rsort($files_array);
                              for ($i = $limit; $i < count($files_array); $i++)  
                                  unlink($dir . DIRECTORY_SEPARATOR . $files_array[$i]);
                          }
                      
                      }
                      
                      
                      dirHandel("/dir/path/here", (new DateTime())->sub(new DateInterval('P30D'))->getTimestamp(), 100);
                      

                      מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                      בכל נושא אפשר ליצור קשר dovid@tchumim.com

                      WWWW תגובה 1 תגובה אחרונה
                      3
                      • WWWW מנותק
                        WWWW מנותק
                        WWW
                        השיב לdovid ב נערך לאחרונה על ידי
                        #18

                        @dovid
                        תודה רבה על הקוד!
                        לא היית צריך לטרוח, פשוט לא הבנתי אותך נכון, חשבתי שאתה מדבר בלי DirectoryIterator.

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

                        אגב 2, אני לא רואה פה פתרון ללולאה, כי כי יש לי 100 תיקיות כאלה, התכונת שאני אעבור על הפונקציה dirHandel עם לולאה?

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

                        לא יודע איך עובד המתודה ->getCTime() האם בכל פעם הוא ניגש למערכת הקבצים או שזה שמור בזכרון?

                        WWW.netfree@gmail.com || קשבק! החזר כספי לבנק על רכישות באינטרנט || עונים על סקרים ומרוויחים כסף!

                        dovidD תגובה 1 תגובה אחרונה
                        0
                        • dovidD מחובר
                          dovidD מחובר
                          dovid ניהול
                          השיב לWWW ב נערך לאחרונה על ידי dovid
                          #19

                          @WWW אמר בעזרה | סקריפט באש למחיקת קבצים מורכבת:

                          פשוט לא הבנתי אותך נכון, חשבתי שאתה מדבר בלי DirectoryIterator.

                          אני לא התכוונתי כלום, כתבתי לך צעדים שלדעתי צריכים להיעשות, ואח"כ הייתי צריך לבדוק איך ליישם את זה בPHP.

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

                          זה אכן משאיר אותם.

                          (כנראה שלא כתבתי ברור למעלה, כשכתבתי AND, התכוונתי שהתנאי למחיקה זה שיהיה ישן וגם לפני 100 אחרונים, ואתה הבנת: שהתנאי להשאיר שגם יהיה חדש וגם מה 100 האחרונים).

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

                          אגב 2, אני לא רואה פה פתרון ללולאה, כי כי יש לי 100 תיקיות כאלה, התכונת שאני אעבור על הפונקציה dirHandel עם לולאה?

                          אכן, כמה פעמים בנושא זה שאמרתי לך שזה מה שכדאי לעשות.

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

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

                          לא יודע איך עובד המתודה ->getCTime() האם בכל פעם הוא ניגש למערכת הקבצים או שזה שמור בזכרון?

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

                          מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                          בכל נושא אפשר ליצור קשר dovid@tchumim.com

                          dovidD WWWW 2 תגובות תגובה אחרונה
                          2
                          • dovidD מחובר
                            dovidD מחובר
                            dovid ניהול
                            השיב לdovid ב נערך לאחרונה על ידי
                            #20

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

                            function dirHandel($dir, $until_date, $limit)
                            {
                                $res_by_ext  = array();
                            
                                foreach (new DirectoryIterator($dir) as $fileInfo) {
                                    $ext = $fileInfo->getExtension();
                                    if ($ext)
                                        $res_by_ext[$ext][] = [$fileInfo->getFilename(), $fileInfo->getCTime()];
                                }
                            
                                foreach ($res_by_ext as $file_type => $files_array) {
                                    usort($files_array, function ($a, $b) {
                                        return strcmp($a[0], $b[0]);
                                    });
                                    for ($i = $limit; $i < count($files_array); $i++)
                                        if ($files_array[$i][1] < $until_date)
                                            unlink($dir . DIRECTORY_SEPARATOR . $files_array[$i][0]);
                                }
                            }
                            

                            מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                            בכל נושא אפשר ליצור קשר dovid@tchumim.com

                            תגובה 1 תגובה אחרונה
                            2
                            • WWWW מנותק
                              WWWW מנותק
                              WWW
                              השיב לdovid ב נערך לאחרונה על ידי WWW
                              #21

                              @dovid אמר בעזרה | סקריפט באש למחיקת קבצים מורכבת:

                              אבל אני מבין שאתה מתכוון שאת המאה יש להרכיב גם מהחדשים.

                              אכן.

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

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

                              אין שום אלפי קריאות.

                              יש, אבל כפי שכתבת:

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

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

                              (אגב, זה רק אצלי שאין אפשרות ציטוט של חלק מהפוסט לאחרונה?)

                              WWW.netfree@gmail.com || קשבק! החזר כספי לבנק על רכישות באינטרנט || עונים על סקרים ומרוויחים כסף!

                              A0533057932A תגובה 1 תגובה אחרונה
                              0
                              • A0533057932A מנותק
                                A0533057932A מנותק
                                A0533057932
                                השיב לWWW ב נערך לאחרונה על ידי
                                #22

                                @WWW אמר בעזרה | סקריפט באש למחיקת קבצים מורכבת:

                                (אגב, זה רק אצלי שאין אפשרות ציטוט של חלק מהפוסט לאחרונה?)

                                באג ידוע
                                תוקן בגרסה 2.0.0 של NODEBB
                                ואולי גם ב1.19.4 אם יצא

                                תגובה 1 תגובה אחרונה
                                1

                                • 1
                                • 2
                                בא תתחבר לדף היומי!
                                • התחברות

                                • אין לך חשבון עדיין? הרשמה

                                • התחברו או הירשמו כדי לחפש.
                                • פוסט ראשון
                                  פוסט אחרון
                                0
                                • דף הבית
                                • קטגוריות
                                • פוסטים אחרונים
                                • משתמשים
                                • חיפוש
                                • חוקי הפורום