Confuz de această comandă `find` într-un script Bash? (Unix, Bash, Script Shell, Găsiți)

MODS Ștergeți contul a intrebat.

Am un script Bash, creat de cineva care nu mai este în stare să explice sensul, care este folosit pentru auto TARing-ul unui folder și pentru a face o copie de siguranță. În momentul de față sunt confuz cu ultima linie:

find '/home/_backups/pokebrawl' -mtime +6 -type f -delete

Scriptul complet este mai jos.

#!/bin/bash
#Purpose = Backup of Important Data
#Created on 17-1-2012
#Author = Hafiz Haider
#Version 1.0
#START
TIME=$(date +"%m-%d-%Y-%T")
FILENAME=pokebrawl-$TIME.tar.gz
SRCDIR=/home/servers/brawl/world
DESDIR=/home/_backups/pokebrawl
tar -cpzf $DESDIR/$FILENAME $SRCDIR
find '/home/_backups/pokebrawl' -mtime +6 -type f -delete
#END

Comentarii

  • Fără întrebări ulterioare, câte o întrebare pentru fiecare întrebare. Puteți pune câte întrebări doriți. Prin urmare, faceți clic pe ask question, apoi puneți o altă întrebare, nu o adăugați la sfârșitul alteia. –  > Por ctrl-alt-delor.
2 răspunsuri
Kusalananda

The find comanda va șterge orice fișier obișnuit în sau sub /home/_backups/pokebrawl care are o vechime mai mare de șapte zile (sau, mai exact, care nu a fost modificat în ultima săptămână).

Ar trebui să probabil să se citească

find "$DESDIR" -mtime +6 -type f -delete

sau

find "${DESDIR:?Not set correctly}" -mtime +6 -type f -delete

deoarece există deja o variabilă foarte bună care conține acest nume de director. A doua variantă ar cauza o eroare dacă DESDIR dintr-un motiv oarecare era goală sau nedefinită.

Presupun că aceasta este o modalitate de a păstra doar copiile de rezervă din ultima săptămână. V-aș sugera să folosiți ceva de genul borgbackup sau restic în schimb, deoarece acestea ar fi capabile să păstreze copii de rezervă pentru mult mai mult timp fără a folosi mult mai mult spațiu (chiar și copiile de rezervă din oră în oră timp de un an nu ar ocupa mult spațiu dacă datele nu se schimbă prea mult). Acestea realizează deduplicarea datelor și borgbackup suportă în plus compresia (ambele suportă și backup-uri la distanță și criptare).

Pentru a rula scriptul la fiecare 24 de ore (la miezul nopții), folosiți un cron job.

Mai întâi, lansați comanda crontab -e. Aceasta va deschide un editor cu crontab-ul curent pentru utilizatorul activ (acesta poate fi sau nu un fișier gol).

Apoi adăugați

@daily /path/to/the/script.sh

(unde path/to/the/script.sh este calea de acces a scriptului).

Salvați și ieșiți din editor.

Scriptul ar fi acum apelat la miezul nopții, chiar și noaptea.

Dacă doriți să rulați scriptul, să zicem, la ora 13:30 în fiecare după-amiază, adăugați în schimb următorul lucru ca intrare crontab:

30 13 * * * /path/to/the/script.sh

Consultați manualul crontab de pe sistemul dvs. pentru detalii despre cum să scrieți un program crontab (man 5 crontab).

Comentarii

  • Pe pagina Ar trebui probabil să se citească aspect : Am văzut că unii scriptori evită în mod deliberat să folosească o variabilă de mediu atunci când fac acest tip de find/delete în cazul în care vreun dobitoc uită să seteze $DESDIR sau o setează din greșeală la „/” sau ceva de genul ăsta. –  > Por steve.
  • @steve Ei bine, dacă DESDIR este schimbat și se modifică find nu este actualizată, nu ar reuși să curețe directorul corect. Ar putea fi util să folosiți ${DESDIR:?Not set correctly} sau ceva similar în schimb. –  > Por Kusalananda.
slm
find '/home/_backups/pokebrawl' -mtime +6 -type f -delete

Aceasta găsește toate fișierele din directorul /home/_backups/pokebrawl care nu au fost modificate în ultimul +6 zile și le șterge. NOTĂ: +6 echivalează cu 7 zile.

Căutați în man find pentru a vedea cum funcționează aceste comutatoare:

$ man find
...
   -mtime n
          File's data was last modified n*24 hours ago.  See the comments 
          for -atime to understand how rounding affects the interpretation 
          of file modification times.

Pe distribuțiile Redhat puteți pune pur și simplu acest script în directorul /etc/crondaily și acesta va rula în fiecare zi. Puteți vedea că acolo există deja alte scripturi pe care le puteți folosi ca exemple:

$ sudo ls -l /etc/cron.daily/
total 12
-rwx------. 1 root root 219 Aug  1  2017 logrotate
-rwxr-xr-x. 1 root root 618 Mar 17  2014 man-db.cron
-rwx------. 1 root root 208 Nov  4  2016 mlocate