Tips en Trucs 2016

Opruimen door de oudste bestanden in een map te verwijderen

Onlangs kreeg ik de melding dat mijn harde schijf vol stond. Geen idee hoe dit kwam. Tot ik de volgende opdracht op mijn Persoonlijke map losliet:

dany@main:~> sudo du -hx | sort -h
...
187G    ./.cache/vmware
187G    ./.cache/vmware/drag_and_drop
188G    ./.cache
238G    .

Deze opdracht bekijkt het schijfgebruik (du) en sorteert de uitvoer op gevonden mapgrootte. Daardoor staan de mappen die de meeste schijfruimte opslorpen onderaan.

Waardoor al heel vlug duidelijk werd wie de boosdoener is: VMware. VMware Player gebruik ik om andere besturingssystemen uit te testen, lessen voor te bereiden en zaken uit te proberen. Telkens je iets kopieert vanaf de virtuele VMware computer naar uw fysieke computer wordt dit in een map opgeslagen, waar het blijft staan en veel schijfruimte opgebruikt.

Vandaar het idee om een script te schrijven om enkel de oudste onderdelen in een map te wissen. Zo krijg ik meer schijfruimte en blijft de drag_and_drop map zijn functie grotendeels vervullen. Controleer voor je zulke drastische verwijderscripts schrijft steeds of er geen andere oplossingen zijn. Bijvoorbeeld een VMware instelling waarbij de cache minder intensief gebruikt wordt. Daarenboven moet je zo'n script grondig testen, je zou niet de eerste zijn die zo een volledig systeem per ongeluk wist. Indien mogelijk zelfs testen op een afgesloten systeem, zoals op een virtuele computer.

Het script

Het eerste deel van het script zorgt voor een testomgeving (-materiaal) waarmee het script zelf (tweede deel) getest kan worden.

#!/bin/bash
# maak een map aan om ons script te testen
mkdir test
# vul de map met bestanden met verschillende aanmaakdatums
for i in {1..500}; do
   touch -d "$i days ago" "test/testbestand $i.txt"
done
echo "Begin het opruimen van oude bestanden"
# hou de 100 recenste bestanden
# welke map ruimen we op
map="test"
# bepaal het aantal bestanden in de op te ruimen map
aantalbestanden=`ls "$map" | wc -l`
# wis bestanden tot er maar 100 overblijven
while [ $((aantalbestanden)) -gt 100 ]; do
  # bepaal het oudste bestand
  oudste=`ls -t "$map"/* | tail -1`
  # verwijder het oudste bestand
  rm "$oudste"
  # bepaal opnieuw het aantal bestanden in de op te ruimen map
  aantalbestanden=`ls "$map" | wc -l`
done

Bestanden op datum gesorteerd

Alle bestanden ouder dan twee weken wissen

Een variant op het vorige script gebruikt datums om te beslissen of een bestand mag verwijderd worden. In het voorbeeld worden alle bestanden ouder dan twee weken gewist.

#!/bin/bash
# maak een map aan om ons script te testen
mkdir test
# vul de map met bestanden met verschillende aanmaakdatums
for i in {1..500}; do
   touch -d "$i days ago" "test/testbestand $i.txt"
done
echo "Begin het opruimen van oude bestanden"
# hou enkel de bestanden jonger dan twee weken
# welke map ruimen we op
map="test"
# bepaal het oudste bestand in de op te ruimen map
oudste=`ls -t "$map"/* | tail -1`
refdatum=`date --date="2 weeks ago" +%s`
oudstedatum=`date --utc --reference="$oudste" +%s`
# wis alle bestanden ouder dan twee weken
while (( refdatum > oudstedatum )); do
  # verwijder het oudste bestand
  rm "$oudste"
  # bepaal opnieuw het oudste bestand in de op te ruimen map
  oudste=`ls -t "$map"/* | tail -1`   
  oudstedatum=`date --utc --reference="$oudste" +%s`
done

Twee weken oud

En verder

Bekijk deze scripts als een basis voor uw eigen scripts. Ze moeten zeker nog verder getest worden op onder andere lege mappen, wat als alle bestanden ouder zijn dan twee weken, enz.