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 (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).
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:
find
: zoekopdrachtDownloads/
: in de map Downloads-type f
: zoek enkel naar bestanden-mtime +30
: die ten minste 30 dagen niet gebruikt werden-exec rm -f
: voer een verwijder opdracht uit op{}
: alle zoekresultaten\;
: einde van de opdracht uitgevoerd op de zoekresultatenVoor 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/
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/
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