Tips en Trucs 2023

Bestanden ouder dan 30 dagen zoeken en verwijderen

Het is een goede gewoonte om van tijd tot tijd op een computersysteem oude of ongebruikte bestanden op te sporen en te verwijderen, omdat dit wat ruimte vrijmaakt op het systeem, die gebruikt kan worden voor een ander doel.

Zorg ervoor dat deze bestanden niet langer nodig zijn, want er wordt niet om bevestiging gevraagd voordat de bestanden worden verwijderd.

Vraag je je af hoe je oudere bestanden op je Linux systeem verwijdert? Deze tip laat je zien hoe je bestanden ouder dan 30 dagen kunt vinden en verwijderen.

Om bestanden ouder dan 30 dagen op je Linux systeem te verwijderen, moet je meerdere opdrachten tegelijk gebruiken, zoals de find opdracht, de mtime opdracht, de exec opdracht en de rm opdracht.

mtime

Mtime (File Last Modify Time) laat zien wanneer je de inhoud van een bestand hebt gewijzigd of bijgewerkt. Het tijdargument beschouwt een invoerwaarde als '24 uur'. Bijvoorbeeld, tijd 2 = 2*24 uur (2 dagen).

Bestanden ouder dan 30 dagen zoeken en verwijderen

Mappen die in aanmerking komen om regelmatig opgeruimd te worden zijn de Prullenbak en de map Downloads. De inhoud van de Prullenbak kan je weergeven met de opdracht:

dany@pindabook:~$ ls .local/share/Trash/files/*

Een lege Prullenbak geeft een foutmelding. Bekijk de afbeelding op het einde van deze tip voor praktische voorbeelden. Als voorbeeld gebruiken we nu de map Downloads. Om te kunnen experimenteren kopiëren we eerst de inhoud van de map Downloads naar de map Test. Daarbij zorgen we met de optie -p (--preserve) dat alle bestands- en mapeigenschappen bewaard blijven. Let ook op * in Downloads/* waardoor niet de map Downloads maar de inhoud ervan gekopieerd wordt.

dany@pindabook:~$ cp -r -p Downloads/* Test/

Eerst zoeken we alle bestanden ouder dan 30 dagen in de map Downloads.

dany@pindabook:~$ find Downloads/ -type f -mtime +30 -print
Downloads/wachtwoord.png
Downloads/jdupes-1.21.1-lp154.7.1.x86_64.rpm
Downloads/buurtfeest.png
Downloads/panel.zip
Downloads/conky_startup.zip
...
Downloads/Twemoji12_1f4dd.svg
Downloads/hydrogen-1.2.0.tar.gz
Downloads/Fanny Decloedt.ics
Downloads/IMG_20230322_165210.jpg
Downloads/Vakbondspremie 2023 ingevuld.pdf

Met deze uitvoer kan je controleren of deze bestanden nodig zijn voordat ze worden verwijderd. Zo niet, verwijder ze dan met:

dany@pindabook:~$ find Downloads/ -type f -mtime +30 -exec rm -f {} \;
dany@pindabook:~$ find Downloads/ -type f -mtime +30 -print

De tweede opdracht is een herhaling van de zoekopdracht om na te gaan of alle bestanden ouder dan 30 dagen effectief zijn verwijderd.

Details:

Voor het volgende experiment herstellen we de map Downloads met de twee volgende opdrachten:

dany@pindabook:~$ rm -r Downloads/*
dany@pindabook:~$ cp -r -p Test/* Downloads/

Er bestaan echter meerdere mogelijkheden om gevonden bestanden te verwijderen. De opdracht find kan de zoekresultaten ook doorgeven aan bijvoorbeeld de opdracht xargs om ze te verwijdern:

dany@pindabook:~$ find Downloads/ -type f -mtime +30 | xargs rm -f
dany@pindabook:~$ find Downloads/ -type f -mtime +30 -print
Downloads/Vakbondspremie 2023.pdf
Downloads/Werkmap/Presentaties/Stijgende grafiek.png
Downloads/Werkmap/Rekenbladen/Euro-USDollar omzetting.ods
Downloads/Vakbondspremie 2023.xopp
Downloads/Fanny Decloedt.ics
Downloads/Vakbondspremie 2023 ingevuld.pdf

Bij de test blijkt echter dat alle bestanden waarbij de naam spaties bevat niet verwijderd zijn. Zo blijkt nog maar eens dat je bij het uitvoeren van opdrachten steeds moet nagaan of het beoogde doel bereikt is. Xargs gebruikt witruimte als scheidingsteken tussen de verschillende zoekresultaten, maar find gebruikt standaard een nieuwe regel (\n). Met de optie -d (--delimiter) zorgen we ervoor dat xargs ook een nieuwe regel als scheidingsteken gebruikt:

dany@pindabook:~$ find Downloads/ -type f -mtime +30 | xargs -d '\n' rm -f
dany@pindabook:~$ find Downloads/ -type f -mtime +30 -print

Hieruit leren we dat we beter onze eerste verwijderopdracht gebruiken. We herstellen de map Downloads met de opdrachten:

dany@pindabook:~$ rm -r Downloads/*
dany@pindabook:~$ cp -r -p Test/* Downloads/

Bestanden ouder dan 30 dagen verwijderen met jokertekens

In veel gevallen moet je bestanden op basis van de naam verwijderen, bijvoorbeeld als er veel logbestanden met verschillende namen in een map staan.

Voer altijd een test uit in plaats van direct te verwijderen. Dit geeft je de tijd om te controleren voordat je de bestanden verwijdert.

dany@pindabook:~$ find Downloads/ -type f -name "*Brief*" -mtime +30 -print
Downloads/Werkmap/Tekstverwerking/BriefhoofdSpeciaal.odt
Downloads/Werkmap/Tekstverwerking/Brief.odt

Misschien heb je het gemerkt, deze opdracht zoekt hoofdlettergevoelig, dus enkel Brief met de hoofdletter B. Om te zoeken naar brief zonder hoodletter b, moet je de zoekterm aanpassen:

dany@pindabook:~$ find Downloads/ -type f -name "*brief*" -mtime +30 -print

In mijn voorbeeld zijn er dus geen zoekresultaten. Om hoofdletter ongevoelig te zoeken, gebruik je in plaats van de optie -name de optie -iname:

dany@pindabook:~$ find Downloads/ -type f -iname "*brief*" -mtime +30 -print
Downloads/Werkmap/Tekstverwerking/BriefhoofdSpeciaal.odt
Downloads/Werkmap/Tekstverwerking/Brief.odt

Uit deze zoekresultaten blijkt dat er in de map Downloads de submap Werkmap aanwezig is. Laten we eens zoeken naar bestanden ouder dan 30 dagen in de Werkmap:

dany@pindabook:~$ find Downloads/ -type f -name "*Werkmap*" -mtime +30 -print

Dit resultaat komt niet overeen met de vorige zoekactie, waar twee bestanden gevonden werden. Tweede poging:

dany@pindabook:~$ find Downloads/ -type f -name "*Werkmap/*" -mtime +30 -print
find: warning: ‘-name’ matches against basenames only, but the given pattern contains a directory separator (‘/’), thus the expression will evaluate to false all the time.  Did you mean ‘-wholename’?

De find opdracht merkt dat we op zoek zijn naar een mapnaam (niet naar een bestandsnaam) en stelt voor om de optie -name te vervangen door de optie -wholename:

dany@pindabook:~$ find Downloads/ -type f -wholename "*Werkmap/*" -mtime +30 -print
Downloads/Werkmap/Databanken/Fitter.odb
Downloads/Werkmap/Databanken/Fitter.svg
Downloads/Werkmap/Databanken/Wijnhandel.odb
...
Downloads/Werkmap/Rekenbladen/Verf.svg
Downloads/Werkmap/Rekenbladen/Fruitwinkel.ods
Downloads/Werkmap/Rekenbladen/Tennisvereniging.ods

Nu kunnen we de gevonden bestanden indien gewenst, verwijderen met:

dany@pindabook:~$ find Downloads/ -type f -wholename "*Werkmap/*" -mtime +30  -exec rm -f {} \;
dany@pindabook:~$ find Downloads/ -type f -wholename "*Werkmap/*" -mtime +30 -print

Voor het volgende experiment herstellen we nogmaals de map Downloads.

dany@pindabook:~$ rm -r Downloads/*
dany@pindabook:~$ cp -r -p Test/* Downloads/

Bestanden ouder dan 30 dagen en met een specifieke extensie verwijderen

Soms moet je bestanden verwijderen op basis van hun bestandsextensie. Voer bijvoorbeeld het volgende uit om bestanden met de extensie ".zip" die binnen 30 dagen zijn gewijzigd op te sporen:

dany@pindabook:~$ find Downloads/ -type f -name "*.zip" -mtime +30 -print
Downloads/panel.zip
Downloads/conky_startup.zip
Downloads/fonts.zip
Downloads/ckeditor5-37.0.1.zip
Downloads/SumatraPDF-3.4.6-64.zip

Verwijder ze daarna met:

dany@pindabook:~$ find Downloads/ -type f -name "*.zip" -mtime +30 -exec rm -f {} \;
dany@pindabook:~$ find Downloads/ -type f -name "*.zip" -mtime +30 -print

De Prullenbak opruimen

Find