Εμφάνιση 1-11 από 11
  1. #1
    Εγγραφή
    04-04-2012
    Μηνύματα
    1.511
    Downloads
    0
    Uploads
    0
    Τύπος
    ADSL2+
    Ταχύτητα
    24576/1024
    ISP
    ΟΤΕ Conn-x
    Router
    Fritz 7270, Mikrotik x86
    έχω ένα server (Linux) όπου έχει διάφορους λογαρισμούς και ο κάθε χρήστης στέλνει στον φάκελο του το backup του. Αυτό γίνεται κάθε περίπου 15 μέρες. Ψάχνω script που θα κρατάει μόνο τα τελευταία 5 αρχεία και θα κάνει delete τα υπόλοιπα.
    προσπαθώ να τροποποιήσω το delete older than x days πχ 5 μέρες
    Κώδικας:
    find /path/to/files* -mtime +5 -exec rm {} \;
    , αλλά δεν μου βγαίνει για αριθμό αρχείων.
    γνωρίζει κανείς κάποιο script ή άλλο τρόπο να το κάνω?

  2. #2
    Εγγραφή
    04-02-2019
    Μηνύματα
    164
    Downloads
    0
    Uploads
    0
    ISP
    Vodafone
    python??
    από stack overflow:
    Κώδικας:
    from pathlib import Path
    import arrow
    
    filesPath = r"C:\scratch\removeThem"
    
    criticalTime = arrow.now().shift(hours=+5).shift(days=-7)
    
    for item in Path(filesPath).glob('*'):
        if item.is_file():
            print (str(item.absolute()))
            itemTime = arrow.get(item.stat().st_mtime)
            if itemTime < criticalTime:
                #remove it
                pass
    https://stackoverflow.com/questions/...er-than-x-days

  3. #3
    Εγγραφή
    04-04-2012
    Μηνύματα
    1.511
    Downloads
    0
    Uploads
    0
    Τύπος
    ADSL2+
    Ταχύτητα
    24576/1024
    ISP
    ΟΤΕ Conn-x
    Router
    Fritz 7270, Mikrotik x86
    αν και θα προτιμούσα bash script.
    κρατάει μόνο τα τελευταία 5 αρχεία? ή των τελευταίων 5 ημερών? θέλω τα τελευταία 5 αρχεία

  4. #4
    Εγγραφή
    28-02-2006
    Μηνύματα
    1.161
    Downloads
    0
    Uploads
    0
    ISP
    Cosmote
    DSLAM
    ΟΤΕ - ΓΑΛΑΤΣΙ
    Παράθεση Αρχικό μήνυμα από atux_null Εμφάνιση μηνυμάτων
    έχω ένα server (Linux) όπου έχει διάφορους λογαρισμούς και ο κάθε χρήστης στέλνει στον φάκελο του το backup του. Αυτό γίνεται κάθε περίπου 15 μέρες
    Το backup του τι είναι, κάποιο tarball με ημερομηνία, ή βάζει χύμα μέσα σε ένα φάκελο αρχεία ότι να ναι;
    Θα πρέπει να γίνεις πιο συγκεκριμένος, αν περιμένεις κάποια σοβαρή απάντηση.
    NetBSD Rocks!
    http://www.netbsd.org

  5. #5
    Εγγραφή
    04-04-2012
    Μηνύματα
    1.511
    Downloads
    0
    Uploads
    0
    Τύπος
    ADSL2+
    Ταχύτητα
    24576/1024
    ISP
    ΟΤΕ Conn-x
    Router
    Fritz 7270, Mikrotik x86
    ειναι αρχεία τύπου tar, zip txt, rsc. ανάλογα από τι σύστημα το τραβάει.

  6. #6
    Εγγραφή
    28-02-2006
    Μηνύματα
    1.161
    Downloads
    0
    Uploads
    0
    ISP
    Cosmote
    DSLAM
    ΟΤΕ - ΓΑΛΑΤΣΙ
    Όλα αυτά τα αρχεία έχουν την ημερομηνία στο filename σαν suffix;

    Π.χ. my_20220211.zip

    Πως τα ομαδοποιείς, για να κρατήσεις τα 5 τελευταία;
    NetBSD Rocks!
    http://www.netbsd.org

  7. #7
    Εγγραφή
    04-04-2012
    Μηνύματα
    1.511
    Downloads
    0
    Uploads
    0
    Τύπος
    ADSL2+
    Ταχύτητα
    24576/1024
    ISP
    ΟΤΕ Conn-x
    Router
    Fritz 7270, Mikrotik x86
    για να το κάνω πιο ευκολο, ας πουμε ότι είναι ενός τύπου πχ my_20220211.zip

  8. #8
    Εγγραφή
    28-02-2006
    Μηνύματα
    1.161
    Downloads
    0
    Uploads
    0
    ISP
    Cosmote
    DSLAM
    ΟΤΕ - ΓΑΛΑΤΣΙ
    Δοκίμασε το oneliner:
    Κώδικας:
    perl -e '@f = <*.*>; foreach(@f) { $key = $_; $key =~ s/^(.*)_\d{8}(\..*)$/$1$2/; if (! exists $h{$key}) { $h{$key} = [$_]; } else { push(@{$h{$key}}, $_); } }  foreach $k(keys %h)  { $s = @{$h{$k}}; if($s > 5) { $t = $s - 5; while($t--) { unlink shift(@{$h{$k}}); } } }'
    Τελευταία επεξεργασία από το μέλος euri : 11-02-22 στις 21:09. Αιτία: προσθήκη του [code] tag
    NetBSD Rocks!
    http://www.netbsd.org

  9. #9
    Εγγραφή
    20-12-2005
    Μηνύματα
    3.220
    Downloads
    4
    Uploads
    0
    Τύπος
    VDSL2
    Ταχύτητα
    49997/4997
    ISP
    ΟΤΕ Conn-x
    DSLAM
    ΟΤΕ - ΞΑΝΘΗ
    Router
    Speedport W 724V
    SNR / Attn
    24,4(dB) / (dB)
    Κώδικας:
    % ls
    keep5.sh*        my_20210225.zip  my_20211225.zip  my_20220210.zip
    my_20210105.zip  my_20211220.zip  my_20220209.zip  my_20220211.zip
    
    % cat keep5.sh 
    #!/bin/zsh
    
    PURGE_ZIPFILES_AFTER="5"
    
    #FOUND_ZIPFILES=( my_*(#qn) )
    FOUND_ZIPFILES=( my_*(oa) )
    rm -v ${FOUND_ZIPFILES[0,-${PURGE_ZIPFILES_AFTER} - 1]}
    
    % ./keep5.sh 
    removed 'my_20210105.zip'
    removed 'my_20210225.zip'
    % ls
    keep5.sh*        my_20211225.zip  my_20220210.zip
    my_20211220.zip  my_20220209.zip  my_20220211.zip
    Edit: Σήμερα μπορώ να γράψω κάτι παραπάνω για το script. Δεν είναι τόσο γενικού σκοπού όσο το perl script του Mosfet αλλά είναι πιο εύκολο στη χρήση.

    Κώδικας:
    my_*
    Το κλασικό globbing pattern που χρησιμοποιούμε παντού (πχ ls *.pdf).
    Κώδικας:
    my_*(#qn)
    Όταν έχουμε κάτι με παρενθέσεις μετά από κάποιο glob, αυτό είναι globbing qualifier και αλλάζει την συμπεριφορά του globbing (πχ να δείξει μόνο αρχεία και όχι καταλόγους, κτλ). Το συγκεκριμένο είναι άσκοπα πολύπλοκο γιατί το αντέγραψα από ένα δικό μου script στο οποίο κάνω και άλλα πράγματα. Το #q επιτρέπει το να βάλεις πολλαπλούς qualifiers μαζί οπότε δεν χρειάζεται εδώ, μου ξέφυγε χτες που το έγραψα γρήγορα. Οπότε αρκεί το my_*(n). Ο qualifier n ενεργοποιεί την αριθμητική ταξινόμηση οπότε αν έχεις τάδε-9 και τάδε-10, να μην πάει το τάδε-10 στην αρχή λόγω ότι 1 < 9 αλλά να το εκλάβει όλο μαζί. Στην προκειμένη περίπτωση που έχουμε ημερομηνίες δεν χρειάζεται καν αυτό αλλά το έβαλα επειδή μπορεί να χρησιμοποιηθεί κάποιος άλλο template για τα αρχεία (πχ με εκδόσεις). Ένας άλλος qualifier που μπορεί να χρησιμοποιηθεί είναι αντί για αριθμητική ταξινόμηση, να χρησιμοποιηθεί ταξινόμηση με βάση την atime ώστε να κρατήσει τα Ν πιο καινούρια άσχετα από το αν έχουνε αριθμητικό όνομα ή όχι. Αυτό γίνεται με τον qualifier o. Οπότε το απλοποιημένο και βελτιωμένο είναι το my_*(oa).
    Κώδικας:
    FOUND_ZIPFILES=( my_*(#qn) )
    Το αποτέλεσμα του globbing δηλαδή τα ταξινομημένα ονόματα αρχείων θα γίνουν μέλη ενός πίνακα ώστε να μπορούμε εύκολα να επιλέξουμε μεταξύ τους.
    Κώδικας:
    rm -v ${FOUND_ZIPFILES[0,-${PURGE_ZIPFILES_AFTER} - 1]}
    Το [x,y] σημαίνει τα στοιχεία του πίνακα από το χ μέχρι το ψ. Όταν ένα από αυτά είναι αρνητικό, αυτό μετράει από το τέλος του πίνακα. Οπότε κάτι σαν το [1,-5] θα σήμαινε όλα τα στοιχεία μέχρι 5 από το τέλος (οπότε δεν θα μπουν σαν όρισμα στην εντολή rm τα 5 τελευταία, οπότε θα μας κρατήσει τα 5 νεώτερα αρχεία λόγω της ταξινόμησης που επιλέξαμε πριν). Επειδή όμως το μέτρημα ξεκινά από το 0, πρέπει να έχουμε [0, -4] έτσι έχουμε το [0, -5 - 1].
    Τελευταία επεξεργασία από το μέλος imitheos : 12-02-22 στις 10:37.
    "I like offending people, because I think people who get offended should be offended" - Linus Torvalds

    "Παλιά είχαμε φτωχούς οι οποίοι ζούσανε σε φτωχογειτονιές. Τώρα, η οικονομικά δυσπραγούσα τάξη
    κατέχει στέγες υποδεέστερης ποιότητας σε υποβαθμισμένα αστικά κέντρα" - George Carlin
    Γα.... την πολιτική ορθότητα.

  10. #10
    Εγγραφή
    04-02-2019
    Μηνύματα
    164
    Downloads
    0
    Uploads
    0
    ISP
    Vodafone
    Μπορεις να κανεις πολλα πραγματα. Αλλη μια λυση θα ηταν να φτιαξεις watched folder καθε πεμπτο αρχειο που δημιουργειται θα σβηνεις το πρωτο.

  11. #11
    Εγγραφή
    28-02-2006
    Μηνύματα
    1.161
    Downloads
    0
    Uploads
    0
    ISP
    Cosmote
    DSLAM
    ΟΤΕ - ΓΑΛΑΤΣΙ
    Αφού εξήγησε ο imitheos πως δουλεύει το script του, ας εξηγήσω και εγώ πως δουλεύει το δικό μου.

    Κώδικας:
    @f = <*.*>;
    Μαζεύω σε ένα array f, από το τρέχον directory, όλα τα αρχεία με όλες τις καταλήξεις. Αν π.χ. ήθελα μόνο τα zip, μπορούσα να βάλω <*.zip> αντί για <*.*>


    Κώδικας:
    foreach(@f) { $key = $_; $key =~ s/^(.*)_\d{8}(\..*)$/$1$2/; if (! exists $h{$key}) { $h{$key} = [$_]; } else { push(@{$h{$key}}, $_); } }
    Στη συνέχεια ομαδοποιώ όλα αυτά τα αρχεία, σε ένα hash h με array elements αυτές τις ομάδες. Το κάνω αυτό, χρησιμοποιώντας για την κατασκευή του κλειδιού το pattern:
    Κώδικας:
    s/^(.*)_\d{8}(\..*)$/$1$2/
    Δηλαδή ουσιαστικά "πετάω" εκτός του κλειδιού το underscore με την ημερομηνία (8 ψηφία πριν την κατάληξη). Π.χ. αν είχα στο directory τα αρχεία:

    dummy.txt
    my_20220110.zip
    my_20220111.zip
    my_20220112.zip
    my_20220210.xlsx
    my_20220211.xlsx

    Το hash μου, μόλις τελειώσει το loop, θα είναι σαν να έκανα την ανάθεση:

    Κώδικας:
    %h = ( 
           dummy.txt => ["dummy.txt"], 
           my.zip    => ["my_20220110.zip", "my_20220111.zip", "my_20220112.zip"],
           my.xlsx   => ["my_20220210.xlsx", "my_20220211.xlsx"]
    );

    Για το τέλος έχουμε:
    Κώδικας:
    foreach $k(keys %h)  { $s = @{$h{$k}}; if($s > 5) { $t = $s - 5; while($t--) { unlink shift(@{$h{$k}}); } } }'
    Δηλαδή loop-άρω στο hash μου και εαν το τρέχον array έχει μεγαλύτερο πλήθος στοιχείων από 5, ας πούμε π.χ. ότι κάποια στιγμή είναι 7, τότε για 2 (= 7 - 5) φορές, θα τραβήξω από το array το πρώτο στοιχείο και θα το σβήσω (ρουτίνα unlink). Εφόσον λοιπόν χρησιμοποιώ γιαπωνέζικο format, θα σβηστούν πρώτα τα αρχεία με τις αρχαιότερες ημερομηνίες.

    Αν όμως ήθελα να γίνω πιο σοφιστικέ και να παίξω με modification time, θα μπορούσα να σορτάρω το array πριν το while, με τον αγαπημένο μου spaceship operator

    Κώδικας:
    @sa = sort{ -M $b <=> -M $a } @{$h{$k}};
    Οπότε, όποιος θέλει να παίξει έτσι, μπορεί να χρησιμοποιήσει το oneliner ():

    Κώδικας:
    perl -e '@f = <*.*>; foreach(@f) { $key = $_; $key =~ s/^(.*)_\d{8}(\..*)$/$1$2/; if (! exists $h{$key}) { $h{$key} = [$_]; } else { push(@{$h{$key}}, $_); } }  foreach $k(keys %h)  { $s = @{$h{$k}}; if($s > 5) { $t = $s - 5; @sa = sort{ -M $b <=> -M $a } @{$h{$k}}; while($t--) { unlink shift(@sa); } } }'

    Φυσικά, το παραπάνω script είναι cross-platform. Καλωσορίσατε στον μαγικό κόσμο της perl.
    NetBSD Rocks!
    http://www.netbsd.org

Bookmarks

Bookmarks

Δικαιώματα - Επιλογές

  • Δεν μπορείτε να δημοσιεύσετε νέα θέματα
  • Δεν μπορείτε να δημοσιεύσετε νέα μηνύματα
  • Δεν μπορείτε να αναρτήσετε συνημμένα
  • Δεν μπορείτε να επεξεργαστείτε τα μηνύματα σας
  •  
  • Τα BB code είναι σε λειτουργία
  • Τα Smilies είναι σε λειτουργία
  • Το [IMG] είναι σε λειτουργία
  • Το [VIDEO] είναι σε λειτουργία
  • Το HTML είναι εκτός λειτουργίας