Linux-commando find: de opties -name, -type, -size, -mtime en -delete
Het Linux-commando find loopt vanaf een startmap naar beneden en vindt bestanden en mappen die voldoen aan voorwaarden zoals naam, type, grootte, wijzigingstijd en rechten. Toen we in een testmap op een AlmaLinux 9-server tien bestanden maakten en het commando uitvoerden met telkens één andere voorwaarde, gaven we de gevonden bestanden uiteindelijk met -exec door aan andere commando's en controleerden we bij verwijderen vóór -delete eerst de lijst met dezelfde voorwaarden.
De paden van de testmap en de bestandstijden in de resultaatvakken zijn vervangen door voorbeeldwaarden. Bij de uitvoer van de Debian 12-server is alleen het pad van de thuismap een voorbeeldwaarde, de rest is ongewijzigd.
1️⃣ Gebruik van het Linux-commando find
De basisvorm is [find startpad voorwaarden]. Laat je het startpad weg, dan zoekt find in de huidige map (.), en zonder voorwaarden toont het alle bestanden en mappen onder het startpad.
We testten in /root/work met drie mappen en tien bestanden zoals hieronder.
find /root/work/root/work
/root/work/docs
/root/work/docs/readme.txt
/root/work/docs/guide.txt
/root/work/docs/old.tmp
/root/work/logs
/root/work/logs/app.log
/root/work/logs/cache.tmp
/root/work/backup
/root/work/report.txt
/root/work/README.md
/root/work/run.sh
/root/work/my notes.txt
/root/work/empty.txtfind sorteert resultaten niet op naam. In deze uitvoering toonde het bij de map docs eerst alle bestanden daarin en ging het daarna verder met logs.
Zet je meerdere voorwaarden achter elkaar, dan blijven alleen bestanden over die aan alle voorwaarden voldoen.
-name vergelijkt alleen de bestandsnaam met het patroon, niet het pad. Zet het patroon tussen enkele aanhalingstekens, zodat de shell * niet eerst uitbreidt maar ongewijzigd aan find doorgeeft.
find /root/work -name '*.txt'/root/work/docs/readme.txt
/root/work/docs/guide.txt
/root/work/report.txt
/root/work/my notes.txt
/root/work/empty.txt-name is hoofdlettergevoelig. Zoeken naar namen die met readme beginnen vond alleen docs/readme.txt, en met -iname kwam ook README.md mee.
find /root/work -name 'readme*'/root/work/docs/readme.txtfind /root/work -iname 'readme*'/root/work/docs/readme.txt
/root/work/README.mdfind zit in het pakket findutils. De versie op de eerste regel van [find --version] was findutils 4.8 op de AlmaLinux 9.8-server en 4.9 op de Debian 12-server.
2️⃣ find -type d en -maxdepth
-type f houdt alleen gewone bestanden over, -type d alleen mappen.
find /root/work -type d/root/work
/root/work/docs
/root/work/logs
/root/work/backupHet startpad /root/work is ook een map en verscheen daarom op de eerste regel. Met -type f op hetzelfde pad verschenen alle tien de bestanden.
-maxdepth bepaalt hoeveel niveaus onder het startpad find afdaalt. Met -maxdepth 1 vielen de bestanden in docs en logs weg en bleven alleen de vijf bestanden direct onder /root/work over.
find /root/work -maxdepth 1 -type f/root/work/report.txt
/root/work/README.md
/root/work/run.sh
/root/work/my notes.txt
/root/work/empty.txtOmgekeerd sloeg -mindepth 2 alles direct onder het startpad over en toonde het alleen de vijf bestanden in submappen.
find /root/work -mindepth 2 -type f/root/work/docs/readme.txt
/root/work/docs/guide.txt
/root/work/docs/old.tmp
/root/work/logs/app.log
/root/work/logs/cache.tmpDe man-pagina raadt aan globale opties zoals -maxdepth direct na het startpad te zetten. Ook -maxdepth 1 na -type f gaf dezelfde vijf bestanden, maar in een terminal verschijnt een waarschuwingsregel om globale opties vooraan te zetten (volgens de man-pagina).
Om alleen te zien hoeveel mappen of bestanden er zijn, geef je de uitvoer door aan wc -l. Het tellen van de uitvoer van -type d gaf 4, inclusief het startpad.
find /root/work -type d | wc -l4Ook met -maxdepth 1 was het 4, omdat alle drie de submappen direct onder het startpad staan.
find /root/work -maxdepth 1 -type d | wc -l4Met -mindepth 2 alleen de bestanden in submappen tellen gaf 5.
find /root/work -mindepth 2 -type f | wc -l53️⃣ Voorwaarden voor grootte en tijd bij find
Een + voor een getal betekent groter dan die waarde, - kleiner, en zonder teken precies die waarde. De eenheden van -size staan in de tabel hieronder (volgens de man-pagina).
| Eenheid | Grootte | Ja |
|---|---|---|
| c | 1 byte | -size +500c |
| k | 1,024 bytes | -size +1k |
| M | 1,048,576 bytes | -size +1M |
| G | 1,073,741,824 bytes | -size +1G |
| (geen) | Blokken van 512 bytes | -size +2 |
find /root/work -type f -size +1k/root/work/docs/guide.txt
/root/work/logs/app.log
/root/work/report.txtGroter dan 1k waren guide.txt met 5,000 bytes, app.log met 2MB en report.txt met 1,200 bytes.
find /root/work -size +1M/root/work/logs/app.logMet twee keer -size als bereik bleven alleen de twee bestanden groter dan 1k en kleiner dan 100k over.
find /root/work -type f -size +1k -size -100k/root/work/docs/guide.txt
/root/work/report.txt-size deelt de grootte door de eenheid en rondt naar boven af voordat het vergelijkt. Daarom telt ook README.md van 300 bytes als 1k, en bij -size -1k verscheen alleen empty.txt met grootte 0.
find /root/work -type f -size -1k/root/work/empty.txtOm tijdvoorwaarden te testen, zetten we de wijzigingstijd van README.md, my notes.txt en docs/readme.txt op 3 dagen geleden en die van de twee .tmp-bestanden op 10 dagen geleden. Elk bestand heeft drie tijden, toegang, wijziging en statuswijziging, die je kunt bekijken met het stat-commando.
-mtime telt de tijd sinds de laatste wijziging in eenheden van 24 uur. Bij -mtime -1 verschenen de vijf bestanden die binnen 24 uur zijn gemaakt.
find /root/work -type f -mtime -1/root/work/docs/guide.txt
/root/work/logs/app.log
/root/work/report.txt
/root/work/run.sh
/root/work/empty.txtBij -mtime +7 verschenen alleen de twee .tmp-bestanden die op 10 dagen geleden stonden. Deze vorm gebruik je om de lijst te controleren voordat je oude logs of tijdelijke bestanden verwijdert.
find /root/work -type f -mtime +7/root/work/docs/old.tmp
/root/work/logs/cache.tmp-mmin rekent hetzelfde in minuten. -mmin -60 gaf dezelfde vijf bestanden als -mtime -1.
find /root/work -type f -mmin -60/root/work/docs/guide.txt
/root/work/logs/app.log
/root/work/report.txt
/root/work/run.sh
/root/work/empty.txt-newer vindt bestanden die later zijn gewijzigd dan een referentiebestand. Met README.md, op 3 dagen geleden gezet, als referentie verschenen de vijf daarna gemaakte bestanden.
find /root/work -type f -newer /root/work/README.md/root/work/docs/guide.txt
/root/work/logs/app.log
/root/work/report.txt
/root/work/run.sh
/root/work/empty.txt-empty vindt zowel bestanden met grootte 0 als lege mappen, en de lege map backup en empty.txt verschenen.
find /root/work -empty/root/work/backup
/root/work/empty.txt4️⃣ find-voorwaarden -perm en -user
Zet je na -perm alleen een getal, dan zoekt het bestanden met precies die rechten. -perm 644 liet run.sh met 755 en my notes.txt met 600 weg en vond acht bestanden.
find /root/work -type f -perm 644/root/work/docs/readme.txt
/root/work/docs/guide.txt
/root/work/docs/old.tmp
/root/work/logs/app.log
/root/work/logs/cache.tmp
/root/work/report.txt
/root/work/README.md
/root/work/empty.txtEen - voor de modus zoekt bestanden die alle opgegeven rechten hebben. Alleen run.sh had het uitvoerrecht van de eigenaar (u+x).
find /root/work -type f -perm -u+x/root/work/run.shEen / voor de modus vindt bestanden met minstens één van de opgegeven rechten. 6000 is SUID (4000) plus SGID (2000), en deze vorm gebruik je om op een server bestanden te controleren die bij uitvoering met de rechten van de eigenaar of groep draaien.
De testmap had zulke bestanden niet. Nadat we run.sh SUID gaven, verscheen run.sh.
chmod u+s /root/work/run.shfind /root/work -type f -perm /6000/root/work/run.shIn oudere bronnen staat op die plek -perm +6000. Letterlijk uitgevoerd eindigde dat met de fout [invalid mode].
find /root/work -type f -perm +6000find: invalid mode '+6000'De +-vorm is verwijderd in findutils 4.5.12 (volgens de man-pagina), schrijf dus /. De voor de test gegeven SUID hebben we met chmod u-s verwijderd.
-user filtert op eigenaarsnaam. Alle testbestanden zijn van root, dus -user root alleen filtert niets weg. Samen met -name voor .log-bestanden bleef alleen app.log over.
find /root/work -type f -user root -name '*.log'/root/work/logs/app.log-nouser vindt bestanden waarvan de eigenaar-UID bij geen account hoort. Dit gebruik je om bestanden te controleren die na het verwijderen van een account zijn achtergebleven. Nadat we de eigenaar van guide.txt op de niet-bestaande UID 1500 zetten, verscheen guide.txt.
chown 1500:1500 /root/work/docs/guide.txtfind /root/work -nouser/root/work/docs/guide.txt-nogroup doet dezelfde controle voor de groep, en guide.txt, waarvan de groep ook op 1500 stond, verscheen. Na de test hebben we dat met chown root:root teruggezet.
Met -o tussen voorwaarden is één ervan genoeg. Samen met een andere voorwaarde zoals -type f zet je de met -o verbonden voorwaarden tussen haakjes. Zet een backslash voor de haakjes, zodat de shell ze niet eerst interpreteert, en laat spaties tussen haakjes en voorwaarden.
find /root/work -type f \( -name '*.log' -o -name '*.tmp' \)/root/work/docs/old.tmp
/root/work/logs/app.log
/root/work/logs/cache.tmp! keert de voorwaarde direct erachter om. Zoeken naar bestanden die geen .txt zijn, vond er vijf.
find /root/work -type f ! -name '*.txt'/root/work/docs/old.tmp
/root/work/logs/app.log
/root/work/logs/cache.tmp
/root/work/README.md
/root/work/run.sh5️⃣ find -exec gebruiken
-exec voert het commando erachter uit voor elk gevonden bestand, met het gevonden pad op de plek van {}. De ; aan het eind van het commando schrijf je als \;, zodat de shell die niet eerst als commandoscheiding leest.
find /root/work -name '*.log' -exec ls -l {} \;-rw-r--r-- 1 root root 2097152 Oct 5 14:10 /root/work/logs/app.logEindig je met + in plaats van \;, dan worden de gevonden paden verzameld en draait het commando maar één keer. Bij vergelijking met echo toonde \; de vijf paden op vijf regels en + op één regel.
find /root/work -name '*.txt' -exec echo {} \;/root/work/docs/readme.txt
/root/work/docs/guide.txt
/root/work/report.txt
/root/work/my notes.txt
/root/work/empty.txtfind /root/work -name '*.txt' -exec echo {} +/root/work/docs/readme.txt /root/work/docs/guide.txt /root/work/report.txt /root/work/my notes.txt /root/work/empty.txtCommando's die meerdere paden aannemen, zoals ls, groepeer je met + om minder keer uit te voeren. De grootte van de drie bestanden boven 1k hebben we gecontroleerd met één ls -lh.
find /root/work -type f -size +1k -exec ls -lh {} +-rw-r--r-- 1 root root 4.9K Oct 5 14:10 /root/work/docs/guide.txt
-rw-r--r-- 1 root root 2.0M Oct 5 14:10 /root/work/logs/app.log
-rw-r--r-- 1 root root 1.2K Oct 5 14:10 /root/work/report.txtOok om de rechten van een webmap in bulk op 644 voor bestanden en 755 voor mappen te zetten gebruik je -exec. Vooraf zochten we bestanden met een afwijkende waarde, en run.sh en my notes.txt verschenen.
find /root/work -type f ! -perm 644/root/work/run.sh
/root/work/my notes.txtBestanden en mappen hebben andere rechten, dus je voert -type f en -type d apart uit. Ook chmod neemt meerdere paden aan, daarom eindigden we met +.
find /root/work -type f -exec chmod 644 {} +find /root/work -type d -exec chmod 755 {} +Opnieuw zoeken met dezelfde voorwaarde vond niets, en de vooraf op 700 gezette map backup stond ook op 755.
Maar run.sh stond nu ook op 644 en gaf bij uitvoeren [Permission denied]. In mappen met uitvoerbare bestanden geef je die bestanden het uitvoerrecht terug met chmod +x.
Om alleen bestanden in submappen te wijzigen, voeg je -mindepth 2 toe. Met 660 veranderden alleen de vijf bestanden in docs en logs, en na controle zetten we ze terug op 644.
find /root/work -mindepth 2 -type f -exec chmod 660 {} +find /root/work -type f -perm 660/root/work/docs/readme.txt
/root/work/docs/guide.txt
/root/work/docs/old.tmp
/root/work/logs/app.log
/root/work/logs/cache.tmpMet find en grep samen zoek je op bestandsinhoud in plaats van op naam. Om een controle op webshells na te bootsen, maakten we vier PHP-bestanden in de aparte map /root/site en zetten we de tekst [base64_decode] in html-cache.php en photo.php in de map upload.
find /root/site -type f/root/site/lib/func.php
/root/site/upload/html-cache.php
/root/site/upload/photo.php
/root/site/index.phpKen je de naam van de webshell, zoek dan met -name. Met -maxdepth 2 om alleen tot de uploadmap af te dalen, verscheen alleen html-cache.php.
find /root/site -maxdepth 2 -type f -name 'html*.php'/root/site/upload/html-cache.phpphoto.php, met een gewone naam, verscheen hier niet. grep -l via -exec toont alleen de paden van bestanden met de tekst, en beide bestanden verschenen.
find /root/site -name '*.php' -exec grep -l 'base64_decode' {} +/root/site/upload/html-cache.php
/root/site/upload/photo.php[base64_decode] is een functie die ook in WordPress-kernbestanden voorkomt, dus open gevonden bestanden en controleer de inhoud voordat je ze verwijdert.
-print0 zet tussen paden een null-teken in plaats van een regeleinde. Het null-teken is op het scherm onzichtbaar, dus de paden stonden aan elkaar op één regel.
find /root/work -name '*.txt' -print0/root/work/docs/readme.txt/root/work/docs/guide.txt/root/work/report.txt/root/work/my notes.txt/root/work/empty.txtOm ook namen met spaties zoals my notes.txt onafgebroken aan een ander commando door te geven, gebruik je de uitvoer van -print0 samen met xargs -0 (volgens de man-pagina).
6️⃣ Bestanden verwijderen met find en opties
Voer vóór het verwijderen eerst dezelfde voorwaarden uit zonder te verwijderen en controleer met eigen ogen de lijst met te verwijderen bestanden.
find /root/work -name '*.tmp'/root/work/docs/old.tmp
/root/work/logs/cache.tmp-exec rm {} \; voert rm uit voor elk gevonden bestand. Alleen in de map logs uitgevoerd werd cache.tmp verwijderd en bleef alleen app.log over.
find /root/work/logs -name '*.tmp' -exec rm {} \;ls /root/work/logsapp.log-delete laat find direct verwijderen zonder rm te starten. Het toonde bij uitvoeren niets, en opnieuw zoeken met dezelfde voorwaarde vond geen .tmp-bestanden meer.
find /root/work -name '*.tmp' -deletefind /root/work -name '*.tmp'-delete moet altijd na de voorwaarden staan. find leest de commandoregel van voor naar achter als één expressie, dus met -delete vooraan probeert het alles onder het startpad te verwijderen voordat het naar voorwaarden kijkt (volgens de man-pagina).
🔲 Opties van het find-commando
📌 Belangrijkste opties: resultaten uit dit artikel
| Optie | Taak | Resultaat in dit artikel | |
|---|---|---|---|
| -name | Vindt namen die bij een patroon passen (hoofdlettergevoelig) | '*.txt' geeft vijf bestanden, 'readme*' alleen docs/readme.txt | |
| -iname | Vergelijkt namen zonder op hoofdletters te letten | 'readme*' geeft docs/readme.txt en README.md | |
| -type f, -type d | Houdt alleen gewone bestanden (f) of mappen (d) over | -type d geeft vier mappen met startpad, -type f tien bestanden | |
| -maxdepth | Daalt maar N niveaus onder het startpad af | -maxdepth 1 laat alleen de vijf bestanden direct onder /root/work over | |
| -mindepth | Slaat niveaus boven N onder het startpad over | -mindepth 2 geeft alleen de vijf bestanden in submappen | |
| -size | Zoekt op grootte (+ groter, - kleiner, eenheden c, k, M, G) | -size +1k geeft drie bestanden, -size -1k alleen empty.txt | |
| -mtime | Vergelijkt de tijd sinds inhoudswijziging in eenheden van 24 uur | -mtime -1 geeft vijf bestanden, -mtime +7 twee .tmp-bestanden | |
| -mmin | Vergelijkt de tijd sinds wijziging in minuten | -mmin -60 geeft dezelfde vijf bestanden als -mtime -1 | |
| -ctime | Vergelijkt in eenheden van 24 uur tot de wijziging van bestandsgegevens zoals rechten en naam | -ctime -1 geeft alle tien de testbestanden | |
| -newer | Vindt wat later is gewijzigd dan een referentiebestand | Vijf bestanden met README.md, op 3 dagen geleden gezet, als referentie | |
| -empty | Vindt bestanden met grootte 0 en lege mappen | Geeft de lege map backup en empty.txt | |
| -perm | Zoekt op rechten (alleen getal: precies die waarde, - ervoor: alle opgegeven, / ervoor: minstens één) | -perm 644 geeft acht bestanden, -perm -u+x run.sh, na SUID geeft -perm /6000 run.sh | |
| -user | Filtert op eigenaarsnaam | Met -name '*.log' geeft het app.log, een niet-bestaand account eindigt met een fout | |
| -nouser | Vindt wat een eigenaar-UID zonder account heeft | Geeft guide.txt met de UID op 1500 | |
| -nogroup | Vindt wat een groep-GID zonder groep heeft | Geeft guide.txt met de GID op 1500 | |
| -o | Houdt over wat aan één van beide voldoet (met andere voorwaarden tussen haakjes) | .log en .tmp samen geven drie bestanden | |
| ! | Keert de voorwaarde direct erachter om | Geeft vijf bestanden die geen .txt zijn | |
| -exec | Voert het commando erachter uit voor elk gevonden bestand (pad op de plek van {}) | Met + aan het eind toont één echo vijf paden op één regel | |
| -print0 | Zet tussen paden een null-teken in plaats van een regeleinde | Het null-teken is onzichtbaar, de paden staan aan elkaar op één regel | |
| -delete | find verwijdert gevonden bestanden direct (na de voorwaarden) | Geen uitvoer, opnieuw zoeken vond geen .tmp-bestanden |
📎 Andere opties: volgens de officiële handleiding
| Optie | Taak | |
|---|---|---|
| -L | Volgt symbolische koppelingen en gebruikt de gegevens van het doelbestand | |
| -path | Vergelijkt het hele pad in plaats van de naam met een shellpatroon | |
| -regex | Vergelijkt het hele pad met een reguliere expressie | |
| -iregex | Vergelijkt zoals -regex, zonder op hoofdletters te letten | |
| -atime | Vergelijkt de tijd sinds de laatste toegang in eenheden van 24 uur | |
| -cnewer | Vindt wat qua status later is gewijzigd dan de wijzigingstijd van het referentiebestand | |
| -group | Filtert op naam van de eigenaarsgroep | |
| -xdev | Daalt niet af in mappen op andere bestandssystemen | |
| -daystart | Rekent tijdvoorwaarden vanaf 0:00 vandaag in plaats van 24 uur geleden | |
| -prune | Daalt bij een map niet verder af | |
| -quit | Stopt meteen (-print -quit toont alleen het eerste resultaat) | |
| -printf | Toont in een zelf bepaalde vorm | |
| -ls | Toont gevonden bestanden in ls -dils-vorm | |
| -fprint | Slaat gevonden paden op in een opgegeven bestand in plaats van op het scherm | |
| -ok | Zoals -exec, maar vraagt eerst of het moet | |
| -execdir | Zoals -exec, maar voert het commando uit in de map van het gevonden bestand |
🔲 Simulator van het find-commando
De simulator hieronder is een virtuele server met dezelfde testmap, waarop je zelf voorwaarden zoals -name, -type, -size, -mtime en -perm plus -exec en -delete kunt uitvoeren.
7️⃣ Fouten van het find-commando
Schrijf je een patroon zonder aanhalingstekens, dan past de shell de regels voor Wildcards toe en breidt het eerst uit tot bestandsnamen in de huidige map. Toen we naar de map docs gingen en *.txt zonder aanhalingstekens schreven, gaf de shell de twee namen guide.txt en readme.txt door en kwam de fout hieronder.
cd /root/work/docsfind /root/work -name *.txtfind: paths must precede expression: `readme.txt'
find: possible unquoted pattern after predicate `-name'?De exitcode was 1.
Zonder \; of + aan het eind van -exec kwam [missing argument to `-exec’].
find /root/work -name '*.log' -exec ls -l {}find: missing argument to `-exec'Een niet-bestaand startpad geeft [No such file or directory] en eindigt met exitcode 1.
find /nonexistent-dir -name xfind: '/nonexistent-dir': No such file or directoryOok een niet-bestaande accountnaam bij -user, of bij -type een andere waarde dan de vaste letters zoals f en d, eindigt meteen met een fout zonder dat het zoeken begint.
find /root/work -user nosuchuserfind: 'nosuchuser' is not the name of a known userfind /root/work -type xfind: Unknown argument to -type: xMet een gewoon account op de Debian 12-server zetten we de rechten van de map lock in de testmap op 000 en doorzochten we daarna de testmap. lock was niet leesbaar, [Permission denied] verscheen en de exitcode was 1.
find ~/findtest/home/user/findtest
/home/user/findtest/report.txt
/home/user/findtest/lock
find: '/home/user/findtest/lock': Permission denied
/home/user/findtest/docs
/home/user/findtest/docs/readme.txtOm alleen de foutregels te verbergen, voeg je 2>/dev/null toe. De foutmelding verdween, maar de exitcode bleef 1.
find ~/findtest -name '*.txt' 2>/dev/null/home/user/findtest/report.txt
/home/user/findtest/docs/readme.txt🔢 FAQ & aanbevolen content
Inhoud zoeken
Linux grep-commando
Een artikel over het grep-commando, dat tekst in bestanden zoekt en die regels toont, en zijn opties.
Verwijderen
Linux rm-commando: de opties van rm -rf en verwijderen zonder bevestiging
Een artikel over de opties -r en -f en de bevestigingsvragen van het rm-commando bij het verwijderen van bestanden en mappen.
Schijfruimte
du-commando: schijfruimte van bestanden controleren
Een artikel over het optellen van de schijfruimte van mappen en bestanden met het du-commando.
ℹ️ Affiliatemelding
De content van deze site bevat affiliatelinks. Koopt een bezoeker via een van deze links een product of dienst, dan ontvangt deze site een commissie van de verkoper. Het bedrag dat de koper betaalt (bij acties gaat het omlaag ↓) wordt daardoor niet hoger. De vermelde prijzen, kortingen en voorraad gelden op het moment van schrijven en kunnen afwijken; controleer ze daarom vóór je aankoop bij de verkoper. Producten worden gekozen en beoordeeld volgens onze eigen criteria, en commissies hebben geen invloed op de volgorde of de inhoud van de beoordelingen.