Brisanje poštanskih sandučića s razmakom u nazivu

Svi mi sistemci vodimo bitku s korisnicima koji najradije ne bi nikada obrisati nijedan mail, tako da im bude uvijek pri ruci negdje na serveru. Uz to obično ide argumentacija "kako im Gmail daje gigabajte prostora, pa zašto ih mi ograničavamo"? Druga je borba s korisnicima koji ponešto i obrišu, ali onda cijeli sandučić ostaje na serveru u posebnoj mapi ("kanti za smeće"). Krivnja je ovakvih korisnika nešto manja jer su poštu obrisali, ali su propustiti napraviti operaciju "Empty",  "Expunge", odnosno "Purge". U tom slučaju pozitivno je što ti sandučići ostaju na /home particiji, a ne na uvijek zakrčenoj /var particiji.

Kako tome možemo doskočiti? Jednostavno, napišemo skriptu kojom obrišemo tu datoteku. Problem je što situacija sa sandučićima smeća može biti šarolika, jer svaki mail klijent stvara svoje sandučiće proizvoljnih naziva za poslani mail, smeće i spam. Evo primjera:

/home/korisnik1/mail/
/home/korisnik1/Mail/
/home/korisnik1/Mail/INBOX.Sent
/home/korisnik1/Mail/INBOX.Trash
/home/korisnik1/Mail/Junk E-mail
/home/korisnik1/Mail/Mail/INBOX.Sent
/home/korisnik1/Mail/Mail/INBOX.Trash
/home/korisnik1/Mail/Mail/Junk E-mail
/home/korisnik1/Deleted Items
/home/korisnik1/Trash

Ukoliko koristite lokalizirani mail čitač, moguće je da imate i dodatne nazive. JOš 2006. godine je kolega Mrkonjić opisao program mail-expire i kako s njime obrisati stare mailove iz "smeća".

No, u ovom slučaju treba nam nešto drugo. Dva su razloga, stara skripta ne podržava razmake u imenu datoteka, niti hrvatske dijakritike (dobro, vjerujemo da bi ovo još i "progutao"). Drugi razlog je da mi želimo u potpunosti obrisati smeće (dakle, mailove koje je korisnik svjesno obrisao), a oprezno brisati mailove iz Junka i Sent foldera. Usput, naučit ćemo dvije stvari oko naredbe find i xargs (više na http://sistemac.carnet.hr/node/826).

Iz članka http://sistemac.carnet.hr/node/640 znamo da je moguće raditi operacije s datotekama koje imaju razmak u imenu, pa smo tako i pokušali:

# find /home -name INBOX.Trash -type f -o -name "Deleted Items" -print0 | xargs -0 rm
rm: cannot remove `/home/korisnik/mail/.imap/Deleted Items': Is a directory

Prisjetimo se značenja pojedinih opcija:

-name    - navodimo naziv datoteke
-type f    - tražimo običnu datoteku, ne direktorij ili posebni oblik datoteka
-print0   - ne koristimo standardni završetak redaka (LF), nego ASCII NUL znak
-o          - logički operator "ILI"

Kako smo onda dobili direktorij, kada smo lijepo naveli "-type f"? Ispada da nakon operatora "-o" (OR) moraju ponovo ići i sve ostale značajke koje tražimo, pa redak mora izgledati ovako:

# find /home -name INBOX.Trash -type f -print0 -o -name "Deleted Items"  -type f -print0 | xargs -0 rm

Taj smo problem riješili, no mogao bi se pojaviti novi. Ako datoteku jednostavno obrišemo, gubimo informacije o grupi i vlasniku, a programi koji barataju mailom osjetljivi su na to (moraju, zbog privatnosti maila). Evo što se događa kada datoteku obrišemo i ponovo je kreiramo:

# ls -l primjer.txt
-rw-r----- 1 root root 15 Jan 14 12:18 primjer.txt
# rm primjer.txt
# touch primjer.txt
# ls -l primjer.txt
-rw-r--r-- 1 root root 0 Jan 14 12:19 primjer.txt

Kod ponovnog kreiranja datoteke, ona se kreira prema umasku trenutnog shella, koji daje drugačija prava nad datotekom od početnog stanja, u ovom slučaju 644 ili -rw-r--r--, pa moramo unaprijed znati koje su vrijednosti bile i vratiti ih na staro. Zato idemo sa "cp /dev/null":

# cp /dev/null primjer.txt
# ls -l primjer.txt
-rw-r----- 1 root root 0 Jan 14 12:18 primjer.txt

Na ovaj način datoteka je ispražnjena, ali je sačuvala mod i vlasnika. Sad možemo napraviti:

# find /home -name INBOX.Trash -type f -print0 -o -name "Deleted Items"  -type f -print0 | xargs -0 cp /dev/null

Kopiranje NULL datoteke (/dev/null) preko mailbox datoteke je bolje od jednostavnog brisanja, jer ovaj način ostavlja mod i usera kakav je i bio.

Inače, za brisanje datoteke možemo koristiti i druge alate, poput naredbe truncate, koja se nalazi u paketu coreutils:

# truncate -s 0 primjer.txt
# ls -l primjer.txt
-rw------- 1 root root 0 Feb 27 14:23 primjer.txt

Također, datoteku je moguće isprazniti i jednostavnim preusmjeravanjem pomoću znaka ">":

# ls -l primjer.txt
-rw------- 1 root root 31 Feb 27 14:18 primjer.txt
# > primjer.txt
# ls -l primjer.txt
-rw------- 1 root root 0 Feb 27 14:19 primjer.txt

Međutim ovaj način nećemo bez dodatnih trikova moći koristiti u naredbi xargs, pa zato koristite naredbu truncate ili kopiranje NULL datoteke za brzo i efikasno pražnjenje nepotrebnih mailbox datoteka.

Kuharice: 
Kategorije: 
Vote: 
0
No votes yet