Puncte:2

Script Bash: ștergeți condiționat fișierele mai vechi, păstrând cele mai recente copii

drapel kp

Notă: Deși există un răspuns de la Jeff-Schaller, depinde de zsh; așa că aș dori să obțin un răspuns bazat pe Bash.

Îmi place să creez un script Bash pentru a șterge condiționat fișierele mai vechi dintr-un director de rezervă.

Există 2 condiții pentru 2 copii de siguranță ale fișierelor distincte:

1, Păstrați cea mai recentă copie a Edge_Profile_*.tgzși ștergeți restul Edge_Profile_*.tgz numai dacă au mai mult de 5 zile.

2, Păstrați cea mai recentă copie a Firefox_Profile_*.tgzși ștergeți restul Firefox_Profile_*.tgz, nu contează câți ani au.

Iată cum am modificat acest răspuns AskUbuntu: https://askubuntu.com/a/933098/928088

Scenariul:

#!/bin/bash

LOG_FILE="/home/admn/Cleanup.log"
TEMP_LOG="/tmp/Temp_Cleanup.log"

mv $LOG_FILE $TEMP_LOG

{

cd /home/admn/Downloads/Test;

echo „Jurnal de curățare:” `data`

găsiți /home/admn/Downloads/Test/Edge_Profile_*.tgz -type f \( -mtime +5 -printf 'Y\t' -o -printf 'N\t' \) -printf '%A@\t% p\0' |
    sortare -zk2,2 | cap -zn -1 | în timp ce se citește -r -d '' flag _ fișier; face \
        cazul „$flag” în 
            „Y”) echo rm „$fișier” 
               ;; 
            *) echo „sare peste $fișier (prea nou)”
               ;; 
        esac;
Terminat

ecou

găsiți /home/admn/Downloads/Test/Firefox_Profile_*.tgz -type f \( -printf 'Y\t' -o -printf 'N\t' \) -printf '%A@\t%p\0' |
    sortare -zk2,2 | cap -zn -1 | în timp ce se citește -r -d '' flag _ fișier; face \
        cazul „$flag” în 
            „Y”) echo rm „$fișier” 
               ;; 
            *) echo „sare peste $fișier (prea nou)”
               ;; 
        esac        
Terminat

} &>> $LOG_FILE

cat $TEMP_LOG >>$LOG_FILE

Ieșire;

Ieșire în fișierul jurnal cu ecou:

/usr/local/scripts/cleanup.sh

rm /home/admn/Downloads/Test/Edge_Profile_Jul_06_2021_00-35.tgz
rm /home/admn/Downloads/Test/Edge_Profile_Jul_07_2021_00-35.tgz
....
se omite /home/admn/Downloads/Test/Edge_Profile_Jul_12_2021_00-35.tgz (prea nou)
se omite /home/admn/Downloads/Test/Edge_Profile_Jul_13_2021_00-35.tgz (prea nou)
....

rm /home/admn/Downloads/Test/Firefox_Profile_Jul_01_2021_00-35.tgz
rm /home/admn/Downloads/Test/Firefox_Profile_Jul_02_2021_00-35.tgz
....

Ieșire în fișierul jurnal în timp ce rulează efectiv scriptul, fără ecou:

/home/admn/Downloads/cleanup.sh: linia 24: se omite /home/admn/Downloads/Test/Edge_Profile_Jul_12_2021_00-35.tgz (prea nou): nu există un astfel de fișier sau director
/home/admn/Downloads/cleanup.sh: linia 24: se omite /home/admn/Downloads/Test/Edge_Profile_Jul_13_2021_00-35.tgz (prea nou): nu există un astfel de fișier sau director
....

Total fișiere din director: 20 fișiere

1, Edge_Profile_*.tgz: Din 06 iulie până pe 17 iulie: 12 fișiere

2, Firefox_Profile_*.tgz: Din 01 iulie până în 08 iulie: 8 fișiere

Problemele:

(1) I gândi scriptul funcționează, dar nu sunt sigur, deoarece am modificat cea mai mare parte fără să știu ce se întâmplă.

(2) Ieșire în fișierul jurnal:

Aș prefera exact aceeași ieșire în fișierul jurnal pe care îl primesc ecou, cu excepția doar a numelor de fișiere (nu cu calea completă), cum ar fi:

rm Edge_Profile_Jul_11_2021_00-35.tgz

se omite Edge_Profile_Jul_12_2021_00-35.tgz (prea nou)

OS: Ubuntu MATE 21.04

Mulțumesc mult.

Puncte:1
drapel ru

Manipularea fișierelor pe baza timpilor de modificare este mult mai ușoară într-un shell care vă permite să le accesați direct. zsh este un astfel de shell. Pur şi simplu sudo apt install zsh pentru a-l instala. Deoarece fișierele dvs. par să fie într-un singur director, acest răspuns este nerecursiv. Demonstrând mai întâi cazul mai simplu:

  • Pentru a păstra cea mai recentă copie a Firefox_Profile_*.tgz și a șterge restul acestora, indiferent de vechime:

    echo ar rm -v -- Firefox_Profile_*.tgz(.om[2,-1])
    

    Scoateți ecou ar porțiune dacă pare corectă. Aceasta folosește a calificativ pentru glob (caracterul metalic). în paranteză pentru a face trei lucruri:

    • selectați numai fișiere simple (nu directoare sau socket-uri sau etc) cu .
    • ordonați (sortați) fișierele după timpul de modificare, de la cel mai nou la cel mai vechi, cu om
    • selectați o porțiune din lista rezultată începând de la al doilea element până la sfârșit -- săriți peste primul fișier (cel mai nou), cu [2,-1]

    Dacă nu există fișiere care se potrivesc, zsh se va opri și se va plânge cu „zsh: nu s-au găsit potriviri” și nu va executa rm.

  • Pentru a păstra cea mai recentă copie a Edge_Profile_*.tgz și pentru a le șterge pe restul doar dacă au mai mult de 5 zile, mai întâi o luăm pe cea mai recentă:

    cel mai nou=(Edge_Profile_*.tgz(.om[1]))
    

    ... și apoi le primim pe cele care au mai mult de cinci zile:

    mai vechi=(Edge_Profil_*.tgz(.m+5))
    

    Partea nouă aici este +5 pe m modificator. Aceasta selectează fișierele care sunt mai vechi de 5 zile. După aceea, ne asigurăm că cel mai nou nu se află în listă de eliminat:

    remove=(„${(@)mai vechi:|cel mai nou}”)
    

    Noua parte aici este simbolul de scădere a matricei :|; este documentat în Secțiunea de extindere a parametrilor din manualul zsh. Selectează elementele „mai vechi” care nu sunt în „cele mai noi”. În cele din urmă, eliminăm acea listă de fișiere:

    echo ar rm -v -- „${remove[@]}”
    
Jags avatar
drapel kp
Vă mulțumesc pentru răspuns, dar îmi place să folosesc „Bash”. „Pentru că ultima dată când am instalat `zsh`, am ajuns să format și cu o instalare curată.
Jeff Schaller avatar
drapel ru
Nu trebuie să-l folosești ca înveliș de zi cu zi; instalați-l și utilizați-l pentru acest script.
Jags avatar
drapel kp
oh, bine, mai târziu voi încerca asta, mai întâi într-un VM. Multumesc din nou.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.