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 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
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
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.